From 08804ca6ff83258e90f7e6c12c80d325c7613aec Mon Sep 17 00:00:00 2001 From: zixing000 Date: Wed, 23 Feb 2022 16:03:59 +0800 Subject: [PATCH 01/19] L1 build success. Signed-off-by: zixing000 --- BUILD.gn | 12 +-- interfaces/inner_kits/native_cpp/BUILD.gn | 45 +++++++++ .../native_cpp/src/device_manager_impl.cpp | 4 +- .../src/ipc/lite/ipc_client_server_proxy.cpp | 2 +- .../src/ipc/lite/ipc_cmd_parser.cpp | 1 + services/devicemanagerservice/BUILD.gn | 92 ++++++++++++++++++- .../commonevent/dm_common_event_manager.h | 2 +- .../src/adapter/lite/dm_adapter_manager.cpp | 22 ++--- .../src/authentication/dm_auth_manager.cpp | 10 ++ .../multipleuser/multiple_user_connector.cpp | 13 ++- .../dependency/softbus/softbus_connector.cpp | 2 +- .../src/device_manager_service.cpp | 11 ++- .../src/ipc/lite/ipc_cmd_parser.cpp | 9 +- .../src/ipc/lite/ipc_server_stub.cpp | 2 +- utils/BUILD.gn | 44 +++++++++ 15 files changed, 229 insertions(+), 42 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 7e5dfc76c..103ee5a70 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -11,13 +11,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import("//build/lite/config/component/lite_component.gni") - if (defined(ohos_lite)) { + import("//build/lite/config/component/lite_component.gni") lite_component("devicemanager_lite") { - if (ohos_kernel_type == "liteos_m") { - } else { - features = [] - } + features = [ + "utils:devicemanagerutils", + "services/devicemanagerservice:devicemanagerservice", + "interfaces/inner_kits/native_cpp:devicemanagersdk", + ] } } diff --git a/interfaces/inner_kits/native_cpp/BUILD.gn b/interfaces/inner_kits/native_cpp/BUILD.gn index 99011143a..83eb9f7ca 100644 --- a/interfaces/inner_kits/native_cpp/BUILD.gn +++ b/interfaces/inner_kits/native_cpp/BUILD.gn @@ -20,6 +20,51 @@ import("//foundation/distributedhardware/devicemanager/devicemanager.gni") if (defined(ohos_lite)) { shared_library("devicemanagersdk") { + include_dirs = [ + "include", + "include/ipc", + "include/ipc/lite", + "include/notify", + "${common_path}/include", + "${common_path}/include/ipc", + "${common_path}/include/ipc/model", + "${utils_path}/include", + "${utils_path}/include/ipc/lite", + ] + include_dirs += [ + "//utils/native/lite/include", + "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits/hilog", + "//third_party/bounds_checking_function/include", + "//foundation/communication/ipc_lite/interfaces/kits", + "//foundation/distributedschedule/samgr_lite/interfaces/kits/samgr", + "//third_party/json/include", + "//foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite/", + ] + sources = [ + "src/device_manager.cpp", + "src/device_manager_impl.cpp", + "src/ipc/ipc_client_proxy.cpp", + "src/ipc/lite/ipc_client_manager.cpp", + "src/ipc/lite/ipc_client_server_proxy.cpp", + "src/ipc/lite/ipc_client_stub.cpp", + "src/ipc/lite/ipc_cmd_parser.cpp", + "src/notify/device_manager_notify.cpp", + ] + deps = [ + "${utils_path}:devicemanagerutils", + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//foundation/communication/ipc_lite:liteipc_adapter", + "//foundation/distributedschedule/samgr_lite/samgr:samgr", + "//third_party/bounds_checking_function:libsec_shared", + "//utils/native/lite:utils", + "//foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite/js/builtin:capability_api", + ] + defines = [ + "LITE_DEVICE", + "HI_LOG_ENABLE", + "DH_LOG_TAG=\"devicemanagerkit\"", + "LOG_DOMAIN=0xD004100", + ] } } else { config("devicemanagersdk_config") { diff --git a/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp b/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp index 811a6d7f4..c263097bb 100644 --- a/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp +++ b/interfaces/inner_kits/native_cpp/src/device_manager_impl.cpp @@ -20,10 +20,11 @@ #include "bundle_info.h" #include "bundle_mgr_client.h" #include "bundle_mgr_interface.h" -#endif #include "if_system_ability_manager.h" #include "iservice_registry.h" #include "system_ability_definition.h" +#include "ipc_skeleton.h" +#endif #include "device_manager_notify.h" #include "dm_constants.h" @@ -38,7 +39,6 @@ #include "ipc_req.h" #include "ipc_rsp.h" #include "ipc_set_useroperation_req.h" -#include "ipc_skeleton.h" #include "ipc_start_discovery_req.h" #include "ipc_stop_discovery_req.h" #include "ipc_unauthenticate_device_req.h" diff --git a/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_client_server_proxy.cpp b/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_client_server_proxy.cpp index 0df352799..21de9b5df 100644 --- a/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_client_server_proxy.cpp +++ b/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_client_server_proxy.cpp @@ -23,10 +23,10 @@ namespace OHOS { namespace DistributedHardware { +const int32_t INVALID_CB_ID = 0xFF; static uint32_t g_deathCbId = INVALID_CB_ID; static SvcIdentity g_svcIdentity; static std::shared_ptr pCurRsp; -const int32_t INVALID_CB_ID = 0xFF; void __attribute__((weak)) HOS_SystemInit(void) { diff --git a/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp b/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp index e1a881b90..9594d21e0 100644 --- a/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp +++ b/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp @@ -28,6 +28,7 @@ #include "ipc_start_discovery_req.h" #include "ipc_stop_discovery_req.h" #include "ipc_verify_authenticate_req.h" +#include "ipc_set_useroperation_req.h" #include "securec.h" namespace OHOS { diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index cde4b3193..23f16507d 100644 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -20,8 +20,96 @@ if (defined(ohos_lite)) { import("//foundation/distributedhardware/devicemanager/devicemanager.gni") if (defined(ohos_lite)) { - executable("devicemanagerservice") { - sources = [ "src/ipc/lite/ipc_server_main.cpp" ] + shared_library("devicemanagerservice") { + include_dirs = [ + "include", + "include/config", + "include/adapter", + "include/authentication", + "include/ability", + "include/deviceinfo", + "include/devicestate", + "include/discovery", + "include/dependency/multipleuser/", + "include/dependency/hichain", + "include/dependency/softbus", + "include/dependency/timer", + "include/ipc", + "include/ipc/lite", + "include/eventbus", + "${common_path}/include", + "${common_path}/include/ipc", + "${common_path}/include/ipc/model", + "${utils_path}/include", + "${utils_path}/include/ipc/lite", + "${innerkits_path}/native_cpp/include", + "${innerkits_path}/native_cpp/include/ipc", + "${innerkits_path}/native_cpp/include/ipc/lite", + ] + include_dirs += [ + "//base/security/deviceauth/interfaces/innerkits", + "//base/startup/syspara_lite/interfaces/innerkits/native/syspara/include", + "//utils/native/lite/include", + "//utils/system/safwk/native/include", + "//third_party/json/include", + "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits/hilog", + "//third_party/bounds_checking_function/include", + "//foundation/communication/ipc_lite/interfaces/kits", + "//foundation/communication/dsoftbus/interfaces/kits/bus_center", + "//foundation/communication/dsoftbus/interfaces/kits/common", + "//foundation/communication/dsoftbus/interfaces/kits/discovery", + "//foundation/communication/dsoftbus/interfaces/kits/transport", + "//foundation/communication/dsoftbus/interfaces/inner_kits/transport", + "//foundation/distributedschedule/samgr_lite/interfaces/kits/samgr", + "//foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy/include", + ] + + sources = [ + "src/ability/lite/dm_ability_manager.cpp", + "src/adapter/lite/dm_adapter_manager.cpp", + "src/authentication/auth_message_processor.cpp", + "src/authentication/auth_request_state.cpp", + "src/authentication/auth_response_state.cpp", + "src/authentication/auth_ui.cpp", + "src/authentication/dm_auth_manager.cpp", + "src/config/dm_config_manager.cpp", + "src/dependency/hichain/hichain_connector.cpp", + "src/dependency/multipleuser/multiple_user_connector.cpp", + "src/dependency/softbus/softbus_connector.cpp", + "src/dependency/softbus/softbus_session.cpp", + "src/dependency/timer/dm_timer.cpp", + "src/device_manager_service.cpp", + "src/device_manager_service_listener.cpp", + "src/deviceinfo/dm_device_info_manager.cpp", + "src/devicestate/dm_device_state_manager.cpp", + "src/discovery/dm_discovery_manager.cpp", + "src/ipc/lite/ipc_cmd_parser.cpp", + "src/ipc/lite/ipc_server_listener.cpp", + "src/ipc/lite/ipc_server_stub.cpp", + ] + ldflags = dm_ldflags + + defines = [ + "LITE_DEVICE", + "HI_LOG_ENABLE", + "DH_LOG_TAG=\"devicemanagerservice\"", + "LOG_DOMAIN=0xD004100", + ] + + deps = [ + "${common_path}/include/dialog_ui/js:dialog_js_files_etc", + "${innerkits_path}/native_cpp:devicemanagersdk", + "${utils_path}:devicemanagerutils", + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//base/security/deviceauth/services:deviceauth_sdk", + "//base/startup/syspara_lite/frameworks/parameter/src:sysparam", + "//foundation/communication/dsoftbus/sdk:softbus_client", + "//foundation/communication/ipc_lite:liteipc_adapter", + "//foundation/distributedschedule/samgr_lite/samgr:samgr", + "//third_party/bounds_checking_function:libsec_shared", + "//third_party/mbedtls:mbedtls_shared", + "//utils/native/lite:utils", + ] } } else if (!support_jsapi) { group("devicemanagerservice") { diff --git a/services/devicemanagerservice/include/dependency/commonevent/dm_common_event_manager.h b/services/devicemanagerservice/include/dependency/commonevent/dm_common_event_manager.h index 81d51bb2a..3f4ee0567 100644 --- a/services/devicemanagerservice/include/dependency/commonevent/dm_common_event_manager.h +++ b/services/devicemanagerservice/include/dependency/commonevent/dm_common_event_manager.h @@ -67,4 +67,4 @@ private: }; } // namespace DistributedHardware } // namespace OHOS -#endif // OHOS_EVENT_MANAGER_ADAPT_H \ No newline at end of file +#endif // OHOS_EVENT_MANAGER_ADAPT_H diff --git a/services/devicemanagerservice/src/adapter/lite/dm_adapter_manager.cpp b/services/devicemanagerservice/src/adapter/lite/dm_adapter_manager.cpp index 9cca65109..ac6f5c480 100644 --- a/services/devicemanagerservice/src/adapter/lite/dm_adapter_manager.cpp +++ b/services/devicemanagerservice/src/adapter/lite/dm_adapter_manager.cpp @@ -26,29 +26,19 @@ DmAdapterManager &DmAdapterManager::GetInstance() return instance; } -DmAdapterManager::DmAdapterManager() +std::shared_ptr DmAdapterManager::GetDecisionAdapter(const std::string &soName) { - LOGI("DmAdapterManager constructor"); + return NULL; } -DmAdapterManager::~DmAdapterManager() +std::shared_ptr DmAdapterManager::GetProfileAdapter(const std::string &soName) { - LOGI("DmAdapterManager destructor"); + return NULL; } -std::shared_ptr DmAdapterManager::GetDecisionAdapter() +std::shared_ptr DmAdapterManager::GetCryptoAdapter(const std::string &soName) { - return decisionAdapterPtr_; -} - -std::shared_ptr DmAdapterManager::GetProfileAdapter() -{ - return profileAdapterPtr_; -} - -std::shared_ptr DmAdapterManager::GetCryptoAdapter() -{ - return cryptoAdapterPtr_; + return NULL; } } // namespace DistributedHardware } // namespace OHOS diff --git a/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp b/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp index dfe504b5c..47d7bf276 100644 --- a/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp +++ b/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp @@ -25,9 +25,11 @@ #include "multiple_user_connector.h" #include "nlohmann/json.hpp" #include "parameter.h" +#ifndef LITE_DEVICE #include "ui_service_mgr_client.h" #include "dialog_callback_stub.h" #include "dialog_callback.h" +#endif namespace OHOS { namespace DistributedHardware { @@ -520,7 +522,9 @@ int32_t DmAuthManager::AddMember(const std::string &deviceId) return DM_FAILED; } LOGI("DmAuthManager::authRequestContext CancelDisplay start"); +#ifndef LITE_DEVICE Ace::UIServiceMgrClient::GetInstance()->CancelDialog(authResponseContext_->aceId); +#endif return DM_OK; } @@ -546,9 +550,11 @@ void DmAuthManager::AuthenticateFinish() { LOGI("DmAuthManager::AuthenticateFinish start"); if (authResponseState_ != nullptr) { +#ifndef LITE_DEVICE if (authResponseState_->GetStateType() == AuthState::AUTH_RESPONSE_FINISH) { Ace::UIServiceMgrClient::GetInstance()->CancelDialog(authResponseContext_->aceId); } +#endif if (!timerMap_.empty()) { for (auto &iter : timerMap_) { iter.second->Stop(SESSION_CANCEL_TIMEOUT); @@ -568,9 +574,11 @@ void DmAuthManager::AuthenticateFinish() authResponseContext_->state = AuthState::AUTH_REQUEST_INIT; } +#ifndef LITE_DEVICE if (authResponseContext_->state == AuthState::AUTH_REQUEST_INPUT) { Ace::UIServiceMgrClient::GetInstance()->CancelDialog(authResponseContext_->aceId); } +#endif listener_->OnAuthResult(authRequestContext_->hostPkgName, authRequestContext_->deviceId, authRequestContext_->token, authResponseContext_->state, authRequestContext_->reason); @@ -664,6 +672,7 @@ void DmAuthManager::ShowConfigDialog() const std::string params = jsonObj.dump(); std::shared_ptr authMgr_ = shared_from_this(); +#ifndef LITE_DEVICE Ace::UIServiceMgrClient::GetInstance()->ShowDialog( "config_dialog_service", params, @@ -674,6 +683,7 @@ void DmAuthManager::ShowConfigDialog() LOGI("CancelDialog start id:%d,event:%s,parms:%s", id, event.c_str(), params.c_str()); authMgr_->StartAuthProcess(atoi(params.c_str())); }); +#endif LOGI("ShowConfigDialog end"); } diff --git a/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp b/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp index 4168ce99e..18835da75 100644 --- a/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp +++ b/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp @@ -17,9 +17,10 @@ #include "dm_constants.h" #include "dm_log.h" +#ifndef LITE_DEVICE #include "os_account_manager.h" - using namespace OHOS::AccountSA; +#endif namespace OHOS { namespace DistributedHardware { @@ -27,12 +28,16 @@ int32_t MultipleUserConnector::oldUserId_ = -1; int32_t MultipleUserConnector::GetCurrentAccountUserID(void) { +#ifndef LITE_DEVICE std::vector ids; ErrCode ret = OsAccountManager::QueryActiveOsAccountIds(ids); if (ret != ERR_OK || ids.empty()) { return -1; } return ids[0]; +#else + return 0; +#endif } void MultipleUserConnector::SetSwitchOldUserId(int32_t userId) @@ -42,7 +47,11 @@ void MultipleUserConnector::SetSwitchOldUserId(int32_t userId) int32_t MultipleUserConnector::GetSwitchOldUserId(void) { +#ifndef LITE_DEVICE return oldUserId_; +#else + return 0; +#endif } } // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp index 4ece01e32..9ee2d2a95 100644 --- a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp +++ b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp @@ -556,4 +556,4 @@ void SoftbusConnector::OnParameterChgCallback(const char *key, const char *value } } } // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/devicemanagerservice/src/device_manager_service.cpp b/services/devicemanagerservice/src/device_manager_service.cpp index 8a02d7265..3a4609e95 100644 --- a/services/devicemanagerservice/src/device_manager_service.cpp +++ b/services/devicemanagerservice/src/device_manager_service.cpp @@ -17,15 +17,19 @@ #include +#ifndef LITE_DEVICE #include "common_event_support.h" -#include "device_manager_service_listener.h" #include "dm_common_event_manager.h" +#endif +#include "device_manager_service_listener.h" #include "dm_constants.h" #include "dm_device_info_manager.h" #include "dm_log.h" #include "multiple_user_connector.h" +#ifndef LITE_DEVICE using namespace OHOS::EventFwk; +#endif namespace OHOS { namespace DistributedHardware { @@ -34,10 +38,12 @@ IMPLEMENT_SINGLE_INSTANCE(DeviceManagerService); DeviceManagerService::~DeviceManagerService() { LOGI("DeviceManagerService destructor"); +#ifndef LITE_DEVICE DmCommonEventManager &dmCommonEventManager = DmCommonEventManager::GetInstance(); if (dmCommonEventManager.UnsubscribeServiceEvent(CommonEventSupport::COMMON_EVENT_USER_STOPPED)) { LOGI("subscribe service event success"); } +#endif softbusConnector_->GetSoftbusSession()->UnRegisterSessionCallback(); hiChainConnector_->UnRegisterHiChainCallback(); } @@ -106,13 +112,14 @@ int32_t DeviceManagerService::Init() LOGI("get current account user id success"); MultipleUserConnector::SetSwitchOldUserId(userId); } - +#ifndef LITE_DEVICE DmCommonEventManager &dmCommonEventManager = DmCommonEventManager::GetInstance(); CommomEventCallback callback = std::bind(&DmAuthManager::UserSwitchEventCallback, *authMgr_.get(), std::placeholders::_1); if (dmCommonEventManager.SubscribeServiceEvent(CommonEventSupport::COMMON_EVENT_USER_SWITCHED, callback)) { LOGI("subscribe service user switch common event success"); } +#endif LOGI("Init success, singleton initialized"); intFlag_ = true; diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp index 6e14961b3..786c5fbed 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp @@ -220,10 +220,8 @@ ON_IPC_SERVER_CMD(UNAUTHENTICATE_DEVICE, IpcIo &req, IpcIo &reply) ON_IPC_SERVER_CMD(VERIFY_AUTHENTICATION, IpcIo &req, IpcIo &reply) { LOGI("VerifyAuthentication service listener."); - std::string pkgName = (const char *)IpcIoPopString(&req, nullptr); std::string authParam = (const char *)IpcIoPopString(&req, nullptr); - - int32_t ret = DeviceManagerService::GetInstance().VerifyAuthentication(pkgName, authParam); + int32_t ret = DeviceManagerService::GetInstance().VerifyAuthentication(authParam); IpcIoPushInt32(&reply, ret); } @@ -247,10 +245,5 @@ ON_IPC_SET_REQUEST(SERVER_DEVICE_FA_NOTIFY, std::shared_ptr pBaseReq, Ip return DM_OK; } -ON_IPC_READ_RESPONSE(SERVER_DEVICE_FA_NOTIFY, IpcIo &request, std::shared_ptr pBaseRsp) -{ - pBaseRsp->SetErrCode(reply.ReadInt32()); - return DM_OK; -} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp index 1a09f1cb6..223faf210 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp @@ -196,7 +196,7 @@ static void HOS_SystemInit(void) return; } -static int32_t IpcServerStubInit(void) +int32_t IpcServerStubInit(void) { HOS_SystemInit(); return DM_OK; diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 7080341e1..dee2b3dc8 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -21,6 +21,50 @@ import("//foundation/distributedhardware/devicemanager/devicemanager.gni") if (defined(ohos_lite)) { shared_library("devicemanagerutils") { + include_dirs = [ + "${common_path}/include", + "${common_path}/include/ipc", + "${common_path}/include/ipc/model", + "include", + "include/ipc/lite", + ] + include_dirs += [ + "//base/security/deviceauth/interfaces/innerkits", + "//base/startup/syspara_lite/interfaces/innerkits/native/syspara/include", + "//utils/native/lite/include", + "//utils/system/safwk/native/include", + "//third_party/json/include", + "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits", + "//third_party/bounds_checking_function/include", + "//foundation/communication/ipc_lite/interfaces/kits", + "//foundation/communication/dsoftbus/interfaces/kits/bus_center", + "//foundation/communication/dsoftbus/interfaces/kits/common", + "//foundation/communication/dsoftbus/interfaces/kits/discovery", + "//foundation/communication/dsoftbus/interfaces/kits/transport", + "//foundation/communication/dsoftbus/interfaces/inner_kits/transport", + "//foundation/distributedschedule/samgr_lite/interfaces/kits/samgr", + ] + sources = [ + "src/dm_anonymous.cpp", + "src/dm_log.cpp", + "src/dm_random.cpp", + "src/ipc/lite/ipc_cmd_register.cpp", + ] + defines = [ + "hI_LOG_ENABLE", + "DH_LOG_TAG=\"devicemanagerutils\"", + "lOG_DOMAIN=0xD004100", + ] + deps = [ + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//base/startup/syspara_lite/frameworks/parameter/src:sysparam", + "//foundation/communication/dsoftbus/sdk:softbus_client", + "//foundation/communication/ipc_lite:liteipc_adapter", + "//foundation/distributedschedule/samgr_lite/samgr:samgr", + "//third_party/bounds_checking_function:libsec_shared", + "//third_party/mbedtls:mbedtls_shared", + "//utils/native/lite:utils", + ] } } else { config("devicemanagerutils_config") { -- Gitee From 35ff0efe4d3c567240097f2689236f69d9583130 Mon Sep 17 00:00:00 2001 From: zixing000 Date: Thu, 3 Mar 2022 15:27:31 +0800 Subject: [PATCH 02/19] L1 devicemanagertest build success. Signed-off-by: zixing000 --- BUILD.gn | 1 + interfaces/inner_kits/native_cpp/BUILD.gn | 3 +- services/devicemanagerservice/BUILD.gn | 6 +- .../dependency/softbus/softbus_connector.cpp | 3 + .../src/ipc/lite/ipc_cmd_parser.cpp | 1 - .../src/ipc/lite/ipc_server_main.cpp | 26 +- test_lite/BUILD.gn | 55 +++ test_lite/device_manager_test.cpp | 322 ++++++++++++++++++ 8 files changed, 412 insertions(+), 5 deletions(-) create mode 100644 test_lite/BUILD.gn create mode 100644 test_lite/device_manager_test.cpp diff --git a/BUILD.gn b/BUILD.gn index 103ee5a70..5b25f37c8 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -18,6 +18,7 @@ if (defined(ohos_lite)) { "utils:devicemanagerutils", "services/devicemanagerservice:devicemanagerservice", "interfaces/inner_kits/native_cpp:devicemanagersdk", + "test_lite:devicemanagertest", ] } } diff --git a/interfaces/inner_kits/native_cpp/BUILD.gn b/interfaces/inner_kits/native_cpp/BUILD.gn index 83eb9f7ca..5abacecb7 100644 --- a/interfaces/inner_kits/native_cpp/BUILD.gn +++ b/interfaces/inner_kits/native_cpp/BUILD.gn @@ -37,6 +37,7 @@ if (defined(ohos_lite)) { "//third_party/bounds_checking_function/include", "//foundation/communication/ipc_lite/interfaces/kits", "//foundation/distributedschedule/samgr_lite/interfaces/kits/samgr", + "//foundation/distributedschedule/samgr_lite/interfaces/kits/registry", "//third_party/json/include", "//foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite/", ] @@ -57,7 +58,7 @@ if (defined(ohos_lite)) { "//foundation/distributedschedule/samgr_lite/samgr:samgr", "//third_party/bounds_checking_function:libsec_shared", "//utils/native/lite:utils", - "//foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite/js/builtin:capability_api", + # "//foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite/js/builtin:capability_api", ] defines = [ "LITE_DEVICE", diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index 23f16507d..758391db5 100644 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -20,7 +20,7 @@ if (defined(ohos_lite)) { import("//foundation/distributedhardware/devicemanager/devicemanager.gni") if (defined(ohos_lite)) { - shared_library("devicemanagerservice") { + executable("devicemanagerservice") { include_dirs = [ "include", "include/config", @@ -34,7 +34,7 @@ if (defined(ohos_lite)) { "include/dependency/hichain", "include/dependency/softbus", "include/dependency/timer", - "include/ipc", + "include", "include/ipc/lite", "include/eventbus", "${common_path}/include", @@ -85,6 +85,8 @@ if (defined(ohos_lite)) { "src/discovery/dm_discovery_manager.cpp", "src/ipc/lite/ipc_cmd_parser.cpp", "src/ipc/lite/ipc_server_listener.cpp", + "src/ipc/lite/ipc_server_listenermgr.cpp", + "src/ipc/lite/ipc_server_main.cpp", "src/ipc/lite/ipc_server_stub.cpp", ] ldflags = dm_ldflags diff --git a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp index 9ee2d2a95..5e58fb12e 100644 --- a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp +++ b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp @@ -72,6 +72,7 @@ int32_t SoftbusConnector::Init() } while (ret != DM_OK); LOGI("RegNodeDeviceStateCb success."); +#ifndef LITE_DEVICE PublishInfo dmPublishInfo; dmPublishInfo.publishId = DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID; dmPublishInfo.mode = DiscoverMode::DISCOVER_MODE_ACTIVE; @@ -108,6 +109,7 @@ int32_t SoftbusConnector::Init() ret = WatchParameter(DISCOVER_STATUS_KEY.c_str(), &SoftbusConnector::OnParameterChgCallback, nullptr); LOGI("register Watch Parameter result is : %d"); +#endif return ret; } @@ -196,6 +198,7 @@ int32_t SoftbusConnector::StartDiscovery(const DmSubscribeInfo &dmSubscribeInfo) LOGE("StartDiscovery failed with ret %d.", ret); return DM_DISCOVERY_FAILED; } + LOGI("StartDiscovery success."); return DM_OK; } diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp index 786c5fbed..be07c9ba8 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_cmd_parser.cpp @@ -244,6 +244,5 @@ ON_IPC_SET_REQUEST(SERVER_DEVICE_FA_NOTIFY, std::shared_ptr pBaseReq, Ip IpcIoPushString(&request, paramJson.c_str()); return DM_OK; } - } // namespace DistributedHardware } // namespace OHOS diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp index e4373c2ad..05f742251 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp @@ -16,12 +16,36 @@ #include #include +#include "device_manager_service.h" +#include "dm_constants.h" +#include "dm_log.h" +#include "ipc_server_stub.h" + +using namespace OHOS::DistributedHardware; + +static void InitAll() +{ + const int32_t DM_SERVICE_INIT_DELAY = 2; + sleep(DM_SERVICE_INIT_DELAY); + if (IpcServerStubInit() != DM_OK) { + LOGI("IpcServerStubInit failed"); + return; + } + DeviceManagerService::GetInstance().Init(); + // if (IpcServerAdapter::GetInstance().ModuleInit() != DM_OK) { + // LOGI("module init failed"); + // return; + // } + LOGI("DM ipc server Init success"); +} + int32_t main(int32_t argc, char *argv[]) { (void)argc; (void)argv; + InitAll(); while (1) { pause(); } return 0; -} \ No newline at end of file +} diff --git a/test_lite/BUILD.gn b/test_lite/BUILD.gn new file mode 100644 index 000000000..c832f9731 --- /dev/null +++ b/test_lite/BUILD.gn @@ -0,0 +1,55 @@ +# Copyright (C) 2021 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. + +if (defined(ohos_lite)) { + import("//build/lite/config/component/lite_component.gni") +} else { + import("//build/ohos.gni") +} + +import("//foundation/distributedhardware/devicemanager/devicemanager.gni") + +if (defined(ohos_lite)) { + executable("devicemanagertest") { + include_dirs = [ + "${common_path}/include", + "${common_path}/include/ipc", + "${common_path}/include/ipc/model", + "${utils_path}/include", + "${utils_path}/include/ipc/lite", + "${innerkits_path}/native_cpp/include", + "${innerkits_path}/native_cpp/include/ipc", + "${innerkits_path}/native_cpp/include/ipc/lite", + "//utils/native/lite/include", + "//foundation/communication/ipc_lite/interfaces/kits", + "//foundation/distributedschedule/samgr_lite/interfaces/kits/samgr", + "//foundation/distributedschedule/samgr_lite/interfaces/kits/registry", + ] + sources = [ + "device_manager_test.cpp", + ] + defines = [ + "LITE_DEVICE", + "HI_LOG_ENABLE", + "DH_LOG_TAG=\"devicemanagerservice\"", + "LOG_DOMAIN=0xD004100", + ] + # cflags_cc = build_flags; + deps = [ + "${innerkits_path}/native_cpp:devicemanagersdk", + "${utils_path}:devicemanagerutils", + "//utils/native/lite:utils", + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + ] + } +} diff --git a/test_lite/device_manager_test.cpp b/test_lite/device_manager_test.cpp new file mode 100644 index 000000000..7e60f67cd --- /dev/null +++ b/test_lite/device_manager_test.cpp @@ -0,0 +1,322 @@ +#include +#include +#include +#include +#include +#include + +#include "securec.h" + +#include "device_manager_impl.h" +#include "device_manager_callback.h" +#include "dm_constants.h" +#include "dm_log.h" +// #include "ipc_server_stub.h" + +// #include "encrypt_utils.h" + +using namespace OHOS::DistributedHardware; + +namespace { +DmDeviceInfo g_deviceInfo; +std::vector g_deviceInfoList; +// const char *DM_CAPABILITY_OSD = "osdCapability"; +std::string g_pinToken = ""; +static std::string packageName = "com.huawei.dosdemo1"; +const int32_t BUF_SIZE = 45 * 1024; +uint8_t g_buf[BUF_SIZE]; +std::mutex lock_; +int32_t g_selectedDeviceNo = 0; +} + +class DmTestInitCallback : public DmInitCallback { +public: + explicit DmTestInitCallback(std::string &bundleName):bundleName_(bundleName) {} + virtual ~DmTestInitCallback(){} + void OnRemoteDied() override; +private: + std::string bundleName_; +}; + +void DmTestInitCallback::OnRemoteDied() +{ + LOGI("OnRemoteDied"); +} + +class DmTestDeviceStateCallback : public DeviceStateCallback { +public: + explicit DmTestDeviceStateCallback(std::string &bundleName):bundleName_(bundleName) {} + virtual ~DmTestDeviceStateCallback(){} + void OnDeviceOnline(const DmDeviceInfo &deviceInfo) override; + void OnDeviceReady(const DmDeviceInfo &deviceInfo) override; + void OnDeviceOffline(const DmDeviceInfo &deviceInfo) override; + void OnDeviceChanged(const DmDeviceInfo &deviceInfo) override; +private: + std::string bundleName_; +}; + +void DmTestDeviceStateCallback::OnDeviceOnline(const DmDeviceInfo &deviceInfo) +{ + LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); + g_deviceInfo = deviceInfo; +} + +void DmTestDeviceStateCallback::OnDeviceReady(const DmDeviceInfo &deviceInfo) +{ + LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); + g_deviceInfo = deviceInfo; +} + +void DmTestDeviceStateCallback::OnDeviceOffline(const DmDeviceInfo &deviceInfo) +{ + LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); + g_deviceInfo = deviceInfo; +} + +void DmTestDeviceStateCallback::OnDeviceChanged(const DmDeviceInfo &deviceInfo) +{ + LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); + g_deviceInfo = deviceInfo; +} + +class DmTestDiscoverCallback : public DiscoveryCallback { +public: + explicit DmTestDiscoverCallback(std::string &bundleName):bundleName_(bundleName) {} + virtual ~DmTestDiscoverCallback(){} + void OnDeviceFound(uint16_t subscribeld, const DmDeviceInfo &deviceInfo) override; + void OnDiscoveryFailed(uint16_t subscribeld, int32_t failedReason) override; + void OnDiscoverySuccess(uint16_t subscribeld) override; +private: + std::string bundleName_; +}; + +void DmTestDiscoverCallback::OnDeviceFound(uint16_t subscribeld, const DmDeviceInfo &deviceInfo) +{ + std::lock_guard autoLock(lock_); + g_deviceInfoList.emplace_back(deviceInfo); + g_deviceInfo = g_deviceInfoList[0]; + for (int i = 0; i < g_deviceInfoList.size(); ++i){ + LOGI("deviceNo:%d, deviceId:%s, deviceName:%s", + i, g_deviceInfoList[i].deviceId, g_deviceInfoList[i].deviceName); + } +} + +void DmTestDiscoverCallback::OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason) +{ + LOGI("OnDiscoverFailed, subscribeId:%u, failedReason:%d", subscribeId, failedReason); +} + +void DmTestDiscoverCallback::OnDiscoverySuccess(uint16_t subscribeId) +{ + LOGI("OnDiscoverSuccess, subscribeId:%u", subscribeId); +} + +class DmTestAuthenticateCallback : public AuthenticateCallback { +public: + explicit DmTestAuthenticateCallback(std::string &bundleName):bundleName_(bundleName) {} + virtual ~DmTestAuthenticateCallback(){} + void OnAuthResult(const std::string &deviceId, const std::string &pinToken, + int32_t status, int32_t reason) override; + +private: + std::string bundleName_; +}; + +void DmTestAuthenticateCallback::OnAuthResult(const std::string &deviceId, + const std::string &pinToken, int32_t status, int32_t reason) +{ + LOGI("OnAuthResult, deviceId:%s, status:%d, pinToken:%s", deviceId.c_str(), status, pinToken.c_str()); + g_pinToken = pinToken; +} + +class DmTestVerifyAuthCallback : public VerifyAuthCallback { +public: + explicit DmTestVerifyAuthCallback(std::string &bundleName):bundleName_(bundleName) {} + virtual ~DmTestVerifyAuthCallback(){}; + void OnVerifyAuthResult(const std::string &deviceId, + int32_t resultCode, int32_t flag) override; +private: + std::string bundleName_; +}; + +void DmTestVerifyAuthCallback::OnVerifyAuthResult(const std::string &deviceId, int32_t resultCode, int32_t flag) +{ + LOGI("check deviceId:%s, resultCode:%d, flag:%d", deviceId.c_str(), resultCode, flag); +} + +static std::string g_usage = "InitDeviceManager\n" + "StartDeviceDiscovery\n" + "SelectDeviceNo\n" + "AuthenticateDevice\n" + "CheckAuthentication\n" + "GetTrustedDeviceList\n" + "StopDeviceDiscovery\n" + "UnInitDeviceManager\n" + "Exit\n" + "InputPlainText\n" + "DecryptTexit\n"; + +static void printUsage() +{ + LOGI("use the following cmds \n%s", g_usage.c_str()); +} + +std::shared_ptr initCallback; + +void InitDeviceManager() +{ + LOGI("devicemanagertest start. package name:%s", packageName.c_str()); + initCallback = std::make_shared(packageName); + if (DeviceManager::GetInstance().InitDeviceManager(packageName, initCallback) == DM_OK) { + LOGI("InitDeviceManager success"); + } +} + +std::shared_ptr discoverCallback; + +void StartDeviceDiscovery() +{ + DmSubscribeInfo dmSubscribeInfo = { + 0, + DM_DISCOVER_MODE_ACTIVE, + DM_AUTO, + DM_HIGH, + false, + true, + "", + }; + g_deviceInfoList.clear(); + g_selectedDeviceNo = 0; + std::string extra = "extra"; + (void)strncpy_s(dmSubscribeInfo.capability, sizeof(dmSubscribeInfo.capability), + DM_CAPABILITY_OSD, strlen(DM_CAPABILITY_OSD)); + discoverCallback = std::make_shared(packageName); + if (DeviceManager::GetInstance().StartDeviceDiscovery( + packageName, dmSubscribeInfo, extra, discoverCallback) == DM_OK) { + LOGI("startDeviceDiscover success"); + } +} + +std::shared_ptr authenticateCallback; + +void AuthenticateDevice() +{ + uint8_t * appIconTmp = (uint8_t*)malloc(10); + appIconTmp[9] = 'B'; + uint8_t * appThumbnailTmp = (uint8_t*)malloc(600); + appThumbnailTmp[599] = 'C'; + + DmAppImageInfo dmAppImageInfo(appIconTmp, 10, appThumbnailTmp, 600); + std::string authExtra = "{\n" + "\"authType\": 1,\n" + "\"targetPkgName\": \"com.huawei.dosdemo1\",\n" + "\"appName\": \"zhengjianming\",\n" + "\"appDescription\": \"hehe\", \n" + "\"business\": 0\n" + "}"; + authenticateCallback = std::make_shared(packageName); + if (DeviceManager::GetInstance().AuthenticateDevice( + packageName, 1, g_deviceInfo,authExtra, authenticateCallback) == DM_OK){ + LOGI("AuthenticateDevice success"); + } + free(appIconTmp); + free(appThumbnailTmp); +} + +std::shared_ptr verifyAuthCallback; + +void CheckAuthentication(std::string& pinCode) +{ + std::string authPara = "{\n" + "\"authType\": 1,\n" + "\"pinCode\": " + pinCode + ",\n" + "\"pinToken\": " + g_pinToken.c_str() + + "}"; + LOGI("authPara:\n%s", authPara.c_str()); + verifyAuthCallback = std::make_shared(packageName); + if (DeviceManager::GetInstance().VerifyAuthentication( + packageName, authPara, verifyAuthCallback) == DM_OK){ + LOGI("CheckAuthentication success"); + } +} + +void GetTrustedDeviceList() +{ + std::vector dmDeviceInfoVec; + std::string extra = "extra"; + if (DeviceManager::GetInstance().GetTrustedDeviceList( + packageName, extra, dmDeviceInfoVec) == DM_OK){ + LOGI("GetTrustedDeviceList success"); + for (DmDeviceInfo dmDeviceInfo : dmDeviceInfoVec) { + LOGI("deviceID: %s,\ndeviceName: %s", + dmDeviceInfo.deviceId, dmDeviceInfo.deviceName); + } + } +} + +void StopDeviceDiscovery() +{ + if (DeviceManager::GetInstance().StopDeviceDiscovery( + packageName, 0) == DM_OK){ + LOGI("StopDeviceDiscovery success"); + } +} + +void UnInitDeviceManager() +{ + if (DeviceManager::GetInstance().UnInitDeviceManager(packageName) == DM_OK){ + LOGI("UnInitDeviceManager success"); + } +} + + +int main(){ + printUsage(); + std::string cmd; + while (std::cin >> cmd) { + if (cmd == "InitDeviceManager") { + InitDeviceManager(); + } else if (cmd == "StartDeviceDiscovery") { + StartDeviceDiscovery(); + } else if (cmd == "SelectDeviceNo") { + int32_t selectNo; + std::cin >> selectNo; + g_selectedDeviceNo = selectNo < g_deviceInfoList.size() ? selectNo : 0; + g_deviceInfo = g_deviceInfoList[g_selectedDeviceNo]; + } else if (cmd == "AuthenticateDevice") { + AuthenticateDevice(); + } else if (cmd == "CheckAuthentication") { + std::string pinCode = ""; + std::cin >> pinCode; + CheckAuthentication(pinCode); + } else if (cmd == "GetTrustedDeviceList") { + GetTrustedDeviceList(); + } else if (cmd == "StopDeviceDiscovery") { + StopDeviceDiscovery(); + } else if (cmd == "UnInitDeviceManager") { + UnInitDeviceManager(); + } else if (cmd == "InputEncryptText") { + // std::string plainText = ""; + // std::cin >> plainText; + // int32_t outLen = 0; + // memset_s(g_buf, BUF_SIZE, 0, BUF_SIZE); + // EncryptUtils::MbedtlsEncrypt((const uint8_t*)encryptText.c_str(), encryptText.size(), + // g_buf, encryptText.size(), &outLen); + LOGI("EncryptText:%s\n", g_buf); + } else if (cmd == "DecryptTexit") { + // int32_t outLen = 0; + // std::string encryptText = (const char*)g_buf; + // memset_s(g_buf, BUF_SIZE, 0, BUF_SIZE); + // EncryptUtils::MbedtlsDecrypt((const uint8_t*)encryptText.c_str(), encryptText.size(), + // g_buf, encryptText.size(), &outLen); + LOGI("PlainText:%s\n", g_buf); + } else if (cmd == "Exit") { + break; + } else { + LOGI("unknown cmd\n"); + } + LOGI("%s end\n", cmd.c_str()); + printUsage(); + } + return 0; +} -- Gitee From b281880ea13b51ef53ba9a5a1074694d486c2a83 Mon Sep 17 00:00:00 2001 From: wangyb0625 Date: Thu, 3 Mar 2022 19:33:34 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E6=8E=92=E6=9F=A5deviceInfo=E4=B8=AD?= =?UTF-8?q?=E7=9A=84Id=E6=98=AFnetworkId=E8=BF=98=E6=98=AFUDID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangyb0625 --- .../native_cpp/include/dm_device_info.h | 1 + .../kits/js/src/native_devicemanager_js.cpp | 2 + .../dependency/softbus/softbus_connector.cpp | 12 +++ utils/BUILD.gn | 2 + utils/include/dm_hash.h | 32 ++++++++ utils/src/dm_hash.cpp | 76 +++++++++++++++++++ 6 files changed, 125 insertions(+) create mode 100644 utils/include/dm_hash.h create mode 100644 utils/src/dm_hash.cpp diff --git a/interfaces/inner_kits/native_cpp/include/dm_device_info.h b/interfaces/inner_kits/native_cpp/include/dm_device_info.h index b17b597b1..662f5d35f 100644 --- a/interfaces/inner_kits/native_cpp/include/dm_device_info.h +++ b/interfaces/inner_kits/native_cpp/include/dm_device_info.h @@ -49,6 +49,7 @@ typedef struct DmDeviceInfo { char deviceId[DM_MAX_DEVICE_ID_LEN]; char deviceName[DM_MAX_DEVICE_NAME_LEN]; uint16_t deviceTypeId; + char networkId[DM_MAX_DEVICE_ID_LEN]; } DmDeviceInfo; typedef struct DmAuthParam { diff --git a/interfaces/kits/js/src/native_devicemanager_js.cpp b/interfaces/kits/js/src/native_devicemanager_js.cpp index 644386adf..a590b43b8 100644 --- a/interfaces/kits/js/src/native_devicemanager_js.cpp +++ b/interfaces/kits/js/src/native_devicemanager_js.cpp @@ -398,6 +398,7 @@ void DeviceManagerNapi::OnDeviceStateChange(DmNapiDevStateChangeAction action, napi_value device = nullptr; napi_create_object(env_, &device); SetValueUtf8String(env_, "deviceId", deviceInfo.deviceId, device); + SetValueUtf8String(env_, "networkId", deviceInfo.networkId, device); SetValueUtf8String(env_, "deviceName", deviceInfo.deviceName, device); SetValueInt32(env_, "deviceType", (int)deviceInfo.deviceTypeId, device); @@ -415,6 +416,7 @@ void DeviceManagerNapi::OnDeviceFound(uint16_t subscribeId, const DmDeviceInfo & napi_value device = nullptr; napi_create_object(env_, &device); SetValueUtf8String(env_, "deviceId", deviceInfo.deviceId, device); + SetValueUtf8String(env_, "networkId", deviceInfo.networkId, device); SetValueUtf8String(env_, "deviceName", deviceInfo.deviceName, device); SetValueInt32(env_, "deviceType", (int)deviceInfo.deviceTypeId, device); diff --git a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp index f3278fe8e..230c3d2ff 100644 --- a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp +++ b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp @@ -429,6 +429,12 @@ int32_t SoftbusConnector::CovertNodeBasicInfoToDmDevice(const NodeBasicInfo &nod std::min(sizeof(dmDeviceInfo.deviceId), sizeof(nodeBasicInfo.networkId))) != DM_OK) { LOGE("copy data failed"); } + + if (memcpy_s(dmDeviceInfo.networkId, sizeof(dmDeviceInfo.networkId), nodeBasicInfo.networkId, + std::min(sizeof(dmDeviceInfo.networkId), sizeof(nodeBasicInfo.networkId))) != DM_OK) { + LOGE("copy data failed"); + } + if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), nodeBasicInfo.deviceName, std::min(sizeof(dmDeviceInfo.deviceName), sizeof(nodeBasicInfo.deviceName))) != DM_OK) { LOGE("copy data failed"); @@ -444,6 +450,12 @@ void SoftbusConnector::CovertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, std::min(sizeof(dmDeviceInfo.deviceId), sizeof(deviceInfo.devId))) != DM_OK) { LOGE("copy data failed"); } + + if (memcpy_s(dmDeviceInfo.networkId, sizeof(dmDeviceInfo.networkId), 0, + sizeof(dmDeviceInfo.networkId)) != DM_OK) { + LOGE("copy data failed"); + } + if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), deviceInfo.devName, std::min(sizeof(dmDeviceInfo.deviceName), sizeof(deviceInfo.devName))) != DM_OK) { LOGE("copy data failed"); diff --git a/utils/BUILD.gn b/utils/BUILD.gn index f1c17e3ee..44a6f02e7 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -31,6 +31,7 @@ if (defined(ohos_lite)) { "${common_path}/include/ipc", "${common_path}/include/ipc/model", "include/permission/standard", + "//third_party/mbedtls/include/mbedtls", ] } @@ -40,6 +41,7 @@ if (defined(ohos_lite)) { "src/dm_log.cpp", "src/dm_random.cpp", "src/ipc/standard/ipc_cmd_register.cpp", + "src/dm_hash.cpp", ] if (support_jsapi) { sources += [ "src/permission/standard/permission_manager.cpp" ] diff --git a/utils/include/dm_hash.h b/utils/include/dm_hash.h new file mode 100644 index 000000000..851e5bfe9 --- /dev/null +++ b/utils/include/dm_hash.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef OHOS_DM_HASH_H +#define OHOS_DM_HASH_H + +#include +#include "base64.h" +#include "ctr_drbg.h" +#include "entropy.h" +#include "gcm.h" +#include "md.h" +#include "platform.h" + +namespace OHOS { +namespace DistributedHardware { +int32_t GetUdidHash(uint8_t *udid, int32_t udiddataLen, uint8_t outudiddData[32]); +} // namespace DistributedHardware +} // namespace OHOS +#endif // OHOS_DM_HASH_H \ No newline at end of file diff --git a/utils/src/dm_hash.cpp b/utils/src/dm_hash.cpp new file mode 100644 index 000000000..488f0b794 --- /dev/null +++ b/utils/src/dm_hash.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021 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 "dm_log.h" +#include "dm_constants.h" +#include "dm_hash.h" + +namespace OHOS { +namespace DistributedHardware { +int32_t GetUdidHash(uint8_t *udid, int32_t udidDataLen, uint8_t outudidData[32]) +{ + LOGI("GetUdidHash"); + if (udid == nullptr || *udid < 0) { + LOGE("udid is nullptr or dataLen: %d", udidDataLen); + return DM_POINT_NULL; + } + mbedtls_md_context_t ctx; + const mbedtls_md_info_t *info; + + mbedtls_md_init(&ctx); + info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); + + if (info == nullptr) { + LOGE("info is nullptr"); + return DM_POINT_NULL; + } + + int32_t ret = DM_OK; + do { + ret = mbedtls_md_setup(&ctx, info, 0); + if (ret != 0) { + LOGE("mbedtls_md_setup is fail"); + ret = DM_FAILED; + break; + } + + ret = mbedtls_md_starts(&ctx); + if (ret != 0) { + LOGE("mbedtls_md_starts is fail"); + ret = DM_FAILED; + break; + } + + ret = mbedtls_md_update(&ctx, udid, udidDataLen); + if (ret != 0) { + LOGE("mbedtls_md_update is fail"); + ret = DM_FAILED; + break; + } + + ret = mbedtls_md_finish(&ctx, outudidData); + if (ret != 0) { + LOGE("mbedtls_md_finish is fail"); + ret = DM_FAILED; + break; + } + ret = DM_OK; + } while (0); + + mbedtls_md_free(&ctx); + return ret; +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file -- Gitee From e00a81a3a314528228668c570f63e4f814ca83eb Mon Sep 17 00:00:00 2001 From: wangyb0625 Date: Thu, 3 Mar 2022 19:49:41 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangyb0625 --- utils/src/dm_hash.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/utils/src/dm_hash.cpp b/utils/src/dm_hash.cpp index 488f0b794..82eee581e 100644 --- a/utils/src/dm_hash.cpp +++ b/utils/src/dm_hash.cpp @@ -31,12 +31,10 @@ int32_t GetUdidHash(uint8_t *udid, int32_t udidDataLen, uint8_t outudidData[32]) mbedtls_md_init(&ctx); info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); - if (info == nullptr) { LOGE("info is nullptr"); - return DM_POINT_NULL; + return DM_POINT_NULL; } - int32_t ret = DM_OK; do { ret = mbedtls_md_setup(&ctx, info, 0); -- Gitee From 5668d391ea3e298c7973e676a879695707192089 Mon Sep 17 00:00:00 2001 From: wangyb0625 Date: Fri, 4 Mar 2022 16:52:15 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E6=8E=92=E6=9F=A5deviceInfo=E4=B8=AD?= =?UTF-8?q?=E7=9A=84Id=E6=98=AFnetworkId=E8=BF=98=E6=98=AFUDID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangyb0625 --- utils/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 44a6f02e7..97f5c361e 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -38,10 +38,10 @@ if (defined(ohos_lite)) { ohos_shared_library("devicemanagerutils") { sources = [ "src/dm_anonymous.cpp", + "src/dm_hash.cpp", "src/dm_log.cpp", "src/dm_random.cpp", "src/ipc/standard/ipc_cmd_register.cpp", - "src/dm_hash.cpp", ] if (support_jsapi) { sources += [ "src/permission/standard/permission_manager.cpp" ] -- Gitee From aff4ce2499a49cca2d57e97db6035a059a40eccf Mon Sep 17 00:00:00 2001 From: wuqi0105 Date: Thu, 10 Mar 2022 10:26:52 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E5=AF=B9=E4=BB=A3=E7=A0=81=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wuqi0105 --- ext/pin_auth/src/pin_auth.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/pin_auth/src/pin_auth.cpp b/ext/pin_auth/src/pin_auth.cpp index 377cb8fdb..4c3e30409 100644 --- a/ext/pin_auth/src/pin_auth.cpp +++ b/ext/pin_auth/src/pin_auth.cpp @@ -16,7 +16,7 @@ #include "pin_auth.h" #include -#include +#include #include "dm_constants.h" #include "dm_log.h" @@ -66,7 +66,7 @@ int32_t PinAuth::StartAuth(std::string &authToken, std::shared_ptr Date: Fri, 11 Mar 2022 13:02:43 +0800 Subject: [PATCH 07/19] =?UTF-8?q?deviceManager=20UI=20=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sin_dzzeng <13277932042@163.com> --- bundle.json | 2 +- devicemanager.gni | 3 + ext/BUILD.gn | 11 +- ext/no_interaction_auth/BUILD.gn | 102 ++++++++++++++++++ .../include/ability/dm_ability_manager.h | 52 +++++++++ .../include/no_interaction_auth.h | 38 +++++++ .../src/ability/lite/dm_ability_manager.cpp | 47 ++++++++ .../ability/standard/dm_ability_manager.cpp | 74 +++++++++++++ .../src/no_interaction_auth.cpp | 56 ++++++++++ ext/pin_auth/BUILD.gn | 1 - ext/show_pin_dialog/dialog_ui/js/BUILD.gn | 4 +- services/devicemanagerservice/BUILD.gn | 11 +- .../include/config/json_config.h | 9 ++ .../src/authentication/dm_auth_manager.cpp | 10 +- 14 files changed, 409 insertions(+), 11 deletions(-) create mode 100644 ext/no_interaction_auth/BUILD.gn create mode 100644 ext/no_interaction_auth/include/ability/dm_ability_manager.h create mode 100644 ext/no_interaction_auth/include/no_interaction_auth.h create mode 100644 ext/no_interaction_auth/src/ability/lite/dm_ability_manager.cpp create mode 100644 ext/no_interaction_auth/src/ability/standard/dm_ability_manager.cpp create mode 100644 ext/no_interaction_auth/src/no_interaction_auth.cpp diff --git a/bundle.json b/bundle.json index 06952ef47..b6d72ecff 100644 --- a/bundle.json +++ b/bundle.json @@ -14,7 +14,7 @@ "name": "device_manager_base", "subsystem": "distributedhardware", "syscap":[ "SystemCapability.DistributedHardware.DeviceManager" ], - "features":[], + "features":["device_manager_base_no_interaction_auth"], "adapted_system_type": [ "standard", "small" ], "rom": "2M", "ram": "16M", diff --git a/devicemanager.gni b/devicemanager.gni index 7487a8b32..03335b53d 100644 --- a/devicemanager.gni +++ b/devicemanager.gni @@ -26,3 +26,6 @@ ext_path = "${devicemanager_path}/ext" #----------------------compilation options--------------------------# dm_ldflags = [ "-lpthread" ] +declare_args() { + device_manager_base_no_interaction_auth = false +} diff --git a/ext/BUILD.gn b/ext/BUILD.gn index df1b58535..37ad93e56 100644 --- a/ext/BUILD.gn +++ b/ext/BUILD.gn @@ -12,13 +12,16 @@ # limitations under the License. import("//build/ohos.gni") +import("//foundation/distributedhardware/devicemanager/devicemanager.gni") group("ext_modules") { deps = [] if (support_jsapi) { - deps += [ - "./pin_auth:devicemanagerext_pin_auth", - "./profile:devicemanagerext_profile", - ] + deps += [ "./profile:devicemanagerext_profile" ] + if (device_manager_base_no_interaction_auth) { + deps += [ "./no_interaction_auth:devicemanagerext_no_interaction_auth" ] + } else { + deps += [ "./pin_auth:devicemanagerext_pin_auth" ] + } } } diff --git a/ext/no_interaction_auth/BUILD.gn b/ext/no_interaction_auth/BUILD.gn new file mode 100644 index 000000000..350f0e18d --- /dev/null +++ b/ext/no_interaction_auth/BUILD.gn @@ -0,0 +1,102 @@ +# Copyright (C) 2021 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. + +if (defined(ohos_lite)) { + import("//build/lite/config/component/lite_component.gni") +} else { + import("//build/ohos.gni") +} + +import("//foundation/distributedhardware/devicemanager/devicemanager.gni") + +if (defined(ohos_lite)) { +} else { + ohos_shared_library("devicemanagerext_no_interaction_auth") { + include_dirs = [ + "include", + "${common_path}/include", + "${ext_path}/pin_auth/include/ability", + "${services_path}/include/dependency/timer", + "${services_path}/include/config", + "${services_path}/include/adapter", + "${services_path}/include/authentication", + "${services_path}/include/ability", + "${services_path}/include/deviceinfo", + "${services_path}/include/devicestate", + "${services_path}/include/discovery", + "${services_path}/include/dependency/commonevent", + "${services_path}/include/dependency/hichain", + "${services_path}/include/dependency/softbus", + "${services_path}/include/dependency/timer", + "${services_path}/include/ipc", + "${services_path}/include/ipc/standard", + "${utils_path}/include", + "${utils_path}/include/ipc/standard", + "${services_path}/include", + "${innerkits_path}/native_cpp/include", + "${common_path}/include/ipc", + "${common_path}/include/ipc/model", + "${innerkits_path}/native_cpp/include", + "${innerkits_path}/native_cpp/include/ipc", + "${innerkits_path}/native_cpp/include/ipc/standard", + "//third_party/json/include", + "//utils/native/base/include", + "//utils/system/safwk/native/include", + "//base/notification/ces_standard/frameworks/core/include", + "//base/notification/ces_standard/interfaces/innerkits/native/include", + "//base/security/deviceauth/interfaces/innerkits", + "//base/startup/syspara_lite/interfaces/kits", + "//base/startup/syspara_lite/adapter/native/syspara/include", + ] + + sources = [ + "src/ability/standard/dm_ability_manager.cpp", + "src/no_interaction_auth.cpp", + ] + + deps = [ + "${innerkits_path}/native_cpp:devicemanagersdk", + "${utils_path}:devicemanagerutils", + "//base/security/deviceauth/services:deviceauth_sdk", + "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", + "//foundation/aafwk/standard/interfaces/innerkits/want:want", + "//foundation/aafwk/standard/services/abilitymgr:abilityms", + "//foundation/distributedhardware/devicemanager/services/devicemanagerservice:devicemanagerservice", + "//utils/native/base:utils", + ] + + external_deps = [ + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", + "ces_standard:cesfwk_core", + "ces_standard:cesfwk_innerkits", + "dsoftbus_standard:softbus_client", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + "samgr_standard:samgr_proxy", + "startup_l2:syspara", + "startup_l2:syspara_watchagent", + ] + + defines = [ + "HI_LOG_ENABLE", + "DH_LOG_TAG=\"devicemanagerext\"", + "LOG_DOMAIN=0xD004100", + ] + + subsystem_name = "distributedhardware" + + part_name = "device_manager_base" + } +} diff --git a/ext/no_interaction_auth/include/ability/dm_ability_manager.h b/ext/no_interaction_auth/include/ability/dm_ability_manager.h new file mode 100644 index 000000000..7f4720954 --- /dev/null +++ b/ext/no_interaction_auth/include/ability/dm_ability_manager.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef OHOS_DM_ABILITY_MANAGER_H +#define OHOS_DM_ABILITY_MANAGER_H + +#include +#include + +namespace OHOS { +namespace DistributedHardware { +enum AbilityRole { ABILITY_ROLE_PASSIVE = 0, ABILITY_ROLE_INITIATIVE = 1, ABILITY_ROLE_UNKNOWN = 2 }; + +enum AbilityStatus { ABILITY_STATUS_FAILED = 0, ABILITY_STATUS_SUCCESS = 1, ABILITY_STATUS_START = 2 }; + +enum FaAction { + USER_OPERATION_TYPE_ALLOW_AUTH = 0, + USER_OPERATION_TYPE_CANCEL_AUTH = 1, + USER_OPERATION_TYPE_AUTH_CONFIRM_TIMEOUT = 2, + USER_OPERATION_TYPE_CANCEL_PINCODE_DISPLAY = 3, + USER_OPERATION_TYPE_CANCEL_PINCODE_INPUT = 4 +}; + +class DmAbilityManager { +public: + AbilityRole GetAbilityRole(); + AbilityStatus StartAbility(AbilityRole role); + void StartAbilityDone(); + +private: + void waitForTimeout(uint32_t timeout_s); + +private: + sem_t mSem_; + AbilityStatus mStatus_; + AbilityRole mAbilityStatus_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif // OHOS_DM_ABILITY_MANAGER_H diff --git a/ext/no_interaction_auth/include/no_interaction_auth.h b/ext/no_interaction_auth/include/no_interaction_auth.h new file mode 100644 index 000000000..9c4ab3815 --- /dev/null +++ b/ext/no_interaction_auth/include/no_interaction_auth.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef OHOS_DM_NO_INTERACTION_AUTH_H +#define OHOS_DM_NO_INTERACTION_AUTH_H + +#include +#include + +#include "authentication.h" +#include "dm_auth_manager.h" +#include "dm_ability_manager.h" + +namespace OHOS { +namespace DistributedHardware { +class NoInteractionAuth : public IAuthentication { +public: + NoInteractionAuth(); + ~NoInteractionAuth(); + int32_t ShowAuthInfo(std::string &authToken, std::shared_ptr authManager) override; + int32_t StartAuth(std::string &authToken, std::shared_ptr authManager) override; + int32_t VerifyAuthentication(std::string &authToken, const std::string &authParam) override; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif // OHOS_DM_NO_INTERACTION_AUTH_H diff --git a/ext/no_interaction_auth/src/ability/lite/dm_ability_manager.cpp b/ext/no_interaction_auth/src/ability/lite/dm_ability_manager.cpp new file mode 100644 index 000000000..d58403aee --- /dev/null +++ b/ext/no_interaction_auth/src/ability/lite/dm_ability_manager.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 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 "dm_ability_manager.h" + +namespace OHOS { +namespace DistributedHardware { +AbilityRole DmAbilityManager::GetAbilityRole() +{ + return mAbilityStatus_; +} + +AbilityStatus DmAbilityManager::StartAbility(AbilityRole role) +{ + // not support for L1 yet, do nothing. just save status and role + mAbilityStatus_ = role; + mStatus_ = AbilityStatus::ABILITY_STATUS_SUCCESS; + return mStatus_; +} + +void DmAbilityManager::waitForTimeout(uint32_t timeout_s) +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += (int32_t)timeout_s; + sem_timedwait(&mSem_, &ts); +} + +void DmAbilityManager::StartAbilityDone() +{ + mStatus_ = AbilityStatus::ABILITY_STATUS_SUCCESS; + sem_post(&mSem_); +} +} // namespace DistributedHardware +} // namespace OHOS diff --git a/ext/no_interaction_auth/src/ability/standard/dm_ability_manager.cpp b/ext/no_interaction_auth/src/ability/standard/dm_ability_manager.cpp new file mode 100644 index 000000000..09d720314 --- /dev/null +++ b/ext/no_interaction_auth/src/ability/standard/dm_ability_manager.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021 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 "dm_ability_manager.h" + +#include "ability_manager_client.h" +#include "ability_manager_service.h" +#include "ability_record.h" +#include "dm_constants.h" +#include "dm_log.h" +#include "parameter.h" +#include "semaphore.h" + +namespace OHOS { +namespace DistributedHardware { +namespace { +const int32_t ABILITY_START_TIMEOUT = 3; // 3 second +const std::string bundleUiName = "com.ohos.devicemanagerui"; +const std::string abilityUiName = "com.ohos.devicemanagerui.MainAbility"; +} // namespace + +AbilityRole DmAbilityManager::GetAbilityRole() +{ + return mAbilityStatus_; +} + +AbilityStatus DmAbilityManager::StartAbility(AbilityRole role) +{ + mAbilityStatus_ = role; + char localDeviceId[DEVICE_UUID_LENGTH] = {0}; + GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH); + std::string deviceId = localDeviceId; + mStatus_ = ABILITY_STATUS_START; + AAFwk::Want want; + AppExecFwk::ElementName element(deviceId, bundleUiName, abilityUiName); + want.SetElement(element); + AAFwk::AbilityManagerClient::GetInstance()->Connect(); + ErrCode result = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want); + if (result != OHOS::ERR_OK) { + LOGE("Start Ability failed"); + mStatus_ = ABILITY_STATUS_FAILED; + return mStatus_; + } + waitForTimeout(ABILITY_START_TIMEOUT); + return mStatus_; +} + +void DmAbilityManager::waitForTimeout(uint32_t timeout_s) +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += (int32_t)timeout_s; + sem_timedwait(&mSem_, &ts); +} + +void DmAbilityManager::StartAbilityDone() +{ + mStatus_ = ABILITY_STATUS_SUCCESS; + sem_post(&mSem_); +} +} // namespace DistributedHardware +} // namespace OHOS diff --git a/ext/no_interaction_auth/src/no_interaction_auth.cpp b/ext/no_interaction_auth/src/no_interaction_auth.cpp new file mode 100644 index 000000000..51d57c150 --- /dev/null +++ b/ext/no_interaction_auth/src/no_interaction_auth.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021 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 "no_interaction_auth.h" + +#include + +#include "dm_constants.h" +#include "dm_log.h" +#include "nlohmann/json.hpp" + +namespace OHOS { +namespace DistributedHardware { +const int32_t MAX_VERIFY_TIMES = 3; +NoInteractionAuth::NoInteractionAuth() +{ + LOGI("NoInteractionAuth constructor"); +} + +NoInteractionAuth::~NoInteractionAuth() +{ +} + +int32_t NoInteractionAuth::ShowAuthInfo(std::string &authToken, std::shared_ptr authManager) +{ + return DM_OK; +} + +int32_t NoInteractionAuth::StartAuth(std::string &authToken, std::shared_ptr authManager) +{ + return DM_OK; +} + +int32_t NoInteractionAuth::VerifyAuthentication(std::string &authToken, const std::string &authParam) +{ + return DM_OK; +} + +extern "C" IAuthentication *CreatePinAuthObject(void) +{ + return new NoInteractionAuth; +} +} // namespace DistributedHardware +} // namespace OHOS diff --git a/ext/pin_auth/BUILD.gn b/ext/pin_auth/BUILD.gn index 41bfe4589..d12332a47 100644 --- a/ext/pin_auth/BUILD.gn +++ b/ext/pin_auth/BUILD.gn @@ -16,7 +16,6 @@ if (defined(ohos_lite)) { } else { import("//build/ohos.gni") } - import("//foundation/distributedhardware/devicemanager/devicemanager.gni") if (defined(ohos_lite)) { diff --git a/ext/show_pin_dialog/dialog_ui/js/BUILD.gn b/ext/show_pin_dialog/dialog_ui/js/BUILD.gn index 8c623e7f8..6fab0d22c 100644 --- a/ext/show_pin_dialog/dialog_ui/js/BUILD.gn +++ b/ext/show_pin_dialog/dialog_ui/js/BUILD.gn @@ -15,7 +15,9 @@ import("//foundation/ace/ace_engine/build/ace_gen_sa_dialog_js.gni") import("//foundation/distributedhardware/devicemanager/devicemanager.gni") gen_sa_dialog_js("dialog_js_files_etc") { - project_path = "//foundation/distributedhardware/devicemanager/ext/show_pin_dialog/dialog_ui/js" + if (!device_manager_base_no_interaction_auth) { + project_path = "//foundation/distributedhardware/devicemanager/ext/show_pin_dialog/dialog_ui/js" + } dialog_name = "show_pin_service" part_name = "device_manager_base" subsystem_name = "distributedhardware" diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index ba6da08e0..7e720ba2a 100755 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -93,7 +93,6 @@ if (defined(ohos_lite)) { ] deps = [ - "${common_path}/include/dialog_ui/js:dialog_js_files_etc", "${innerkits_path}/native_cpp:devicemanagersdk", "${utils_path}:devicemanagerutils", "//base/account/os_account/frameworks/osaccount/native:os_account_innerkits", @@ -101,10 +100,16 @@ if (defined(ohos_lite)) { "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", "//foundation/aafwk/standard/interfaces/innerkits/want:want", "//foundation/aafwk/standard/services/abilitymgr:abilityms", - "//foundation/ace/ace_engine/interfaces/innerkits/ui_service_manager:ui_service_mgr", - "//foundation/windowmanager/wm:libwm", ] + if (!device_manager_base_no_interaction_auth) { + deps += [ + "${common_path}/include/dialog_ui/js:dialog_js_files_etc", + "//foundation/ace/ace_engine/interfaces/innerkits/ui_service_manager:ui_service_mgr", + "//foundation/windowmanager/wm:libwm", + ] + defines += [ "SUPPORT_GRAPHICS" ] + } external_deps = [ "ability_runtime:app_manager", "bundle_framework:appexecfwk_base", diff --git a/services/devicemanagerservice/include/config/json_config.h b/services/devicemanagerservice/include/config/json_config.h index 04c929323..acb7839c0 100644 --- a/services/devicemanagerservice/include/config/json_config.h +++ b/services/devicemanagerservice/include/config/json_config.h @@ -79,6 +79,15 @@ const std::string authJsonConfigString = "funcName": "CreateNfcAuthObject", "soName": "libdevicemanager_nfcauth.z.so", "soPath": "/system/lib/" + }, + { + "name": "no_interaction_auth", + "type": "AUTHENTICATE", + "version": "1.0", + "authType": 4, + "funcName": "CreatePinAuthObject", + "soName": "libdevicemanagerext_no_interaction_auth.z.so", + "soPath": "/system/lib/" } ] })"; diff --git a/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp b/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp index b45af3e11..2fc6956ca 100644 --- a/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp +++ b/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp @@ -25,9 +25,11 @@ #include "multiple_user_connector.h" #include "nlohmann/json.hpp" #include "parameter.h" +#ifdef SUPPORT_GRAPHICS #include "ui_service_mgr_client.h" #include "dialog_callback_stub.h" #include "dialog_callback.h" +#endif namespace OHOS { namespace DistributedHardware { @@ -544,7 +546,9 @@ int32_t DmAuthManager::AddMember(const std::string &deviceId) return DM_FAILED; } LOGI("DmAuthManager::authRequestContext CancelDisplay start"); +#ifdef SUPPORT_GRAPHICS Ace::UIServiceMgrClient::GetInstance()->CancelDialog(authResponseContext_->pageId); +#endif return DM_OK; } @@ -572,6 +576,7 @@ int32_t DmAuthManager::JoinNetwork() void DmAuthManager::AuthenticateFinish() { LOGI("DmAuthManager::AuthenticateFinish start"); +#ifdef SUPPORT_GRAPHICS if (authResponseState_ != nullptr) { if (authResponseState_->GetStateType() == AuthState::AUTH_RESPONSE_FINISH) { Ace::UIServiceMgrClient::GetInstance()->CancelDialog(authResponseContext_->pageId); @@ -621,6 +626,7 @@ void DmAuthManager::AuthenticateFinish() authRequestState_ = nullptr; authMessageProcessor_ = nullptr; } +#endif LOGI("DmAuthManager::AuthenticateFinish complete"); } @@ -693,6 +699,7 @@ int32_t DmAuthManager::GetPinCode() void DmAuthManager::ShowConfigDialog() { +#ifdef SUPPORT_GRAPHICS LOGI("ShowConfigDialog start"); nlohmann::json jsonObj; jsonObj[TAG_AUTH_TYPE] = AUTH_TYPE_PIN; @@ -713,7 +720,8 @@ void DmAuthManager::ShowConfigDialog() authMgr_->StartAuthProcess(atoi(params.c_str())); }); LOGI("ShowConfigDialog end"); -} +#endif + } void DmAuthManager::ShowAuthInfoDialog() { -- Gitee From ecbc248d01652946a3b1e163040f7552c844ccda Mon Sep 17 00:00:00 2001 From: wangyb0625 Date: Fri, 11 Mar 2022 21:27:11 +0800 Subject: [PATCH 08/19] =?UTF-8?q?=E5=86=85=E6=BA=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=8D=95=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangyb0625 --- .../@ohos.distributedHardware.deviceManager.d.ts | 2 +- .../kits/js/include/dm_native_event.h | 2 +- .../kits/js/src/native_devicemanager_js.cpp | 2 +- .../src/ability/standard/dm_ability_manager.cpp | 2 +- .../src/auth/hichain_connector.cpp | 14 +++++++------- .../src/dispatch/server_stub.cpp | 10 ++-------- .../native_cpp/src/ipc/lite/ipc_cmd_parser.cpp | 4 ++-- .../src/ipc/standard/ipc_client_stub.cpp | 4 ++-- .../src/notify/device_manager_notify.cpp | 2 +- .../src/dependency/hichain/hichain_connector.cpp | 4 ++-- .../src/dependency/timer/dm_timer.cpp | 3 +-- .../src/device_manager_service_listener.cpp | 2 +- .../src/discovery/dm_discovery_manager.cpp | 2 +- .../src/ipc/lite/ipc_server_main.cpp | 2 +- .../src/ipc/lite/ipc_server_stub.cpp | 14 +++++++------- .../src/ipc/standard/ipc_cmd_parser.cpp | 4 ++++ .../src/ipc/standard/ipc_server_stub.cpp | 2 +- utils/src/dm_random.cpp | 6 +++--- 18 files changed, 39 insertions(+), 42 deletions(-) diff --git a/display/@ohos.distributedHardware.deviceManager.d.ts b/display/@ohos.distributedHardware.deviceManager.d.ts index 69179ba17..d00376306 100644 --- a/display/@ohos.distributedHardware.deviceManager.d.ts +++ b/display/@ohos.distributedHardware.deviceManager.d.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 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 diff --git a/ext/mini/interfaces_mini/kits/js/include/dm_native_event.h b/ext/mini/interfaces_mini/kits/js/include/dm_native_event.h index d2975263a..c0be7ad11 100644 --- a/ext/mini/interfaces_mini/kits/js/include/dm_native_event.h +++ b/ext/mini/interfaces_mini/kits/js/include/dm_native_event.h @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -// + #ifndef OHOS_DEVICE_MANAGER_NATIVE_EVENT_H #define OHOS_DEVICE_MANAGER_NATIVE_EVENT_H diff --git a/ext/mini/interfaces_mini/kits/js/src/native_devicemanager_js.cpp b/ext/mini/interfaces_mini/kits/js/src/native_devicemanager_js.cpp index 50686dfb6..e90ff6dcb 100644 --- a/ext/mini/interfaces_mini/kits/js/src/native_devicemanager_js.cpp +++ b/ext/mini/interfaces_mini/kits/js/src/native_devicemanager_js.cpp @@ -549,7 +549,7 @@ void DeviceManagerModule::JsToDmBuffer(const JSIValue &object, } *bufferPtr = (uint8_t*)calloc(sizeof(uint8_t), length); if (*bufferPtr == nullptr) { - DMLOG(DM_LOG_ERROR, "low memory, calloc return nullptr, length is %d, filed %s", length, fieldStr.c_str()); + DMLOG(DM_LOG_ERROR, "low memory, calloc return nullptr, length is %zu, filed %s", length, fieldStr.c_str()); return; } if (memcpy_s(*bufferPtr, length, data, length) != 0) { diff --git a/ext/mini/services/devicemanagerservice/src/ability/standard/dm_ability_manager.cpp b/ext/mini/services/devicemanagerservice/src/ability/standard/dm_ability_manager.cpp index 472831899..69143cada 100644 --- a/ext/mini/services/devicemanagerservice/src/ability/standard/dm_ability_manager.cpp +++ b/ext/mini/services/devicemanagerservice/src/ability/standard/dm_ability_manager.cpp @@ -72,7 +72,7 @@ AbilityStatus DmAbilityManager::StartAbility(AbilityRole role) if (result == OHOS::ERR_OK) { DMLOG(DM_LOG_INFO, "Start Ability succeed"); } else { - DMLOG(DM_LOG_INFO, "Start Ability faild"); + DMLOG(DM_LOG_INFO, "Start Ability failed"); mStatus_ = AbilityStatus::ABILITY_STATUS_FAILED; return mStatus_; } diff --git a/ext/mini/services/devicemanagerservice/src/auth/hichain_connector.cpp b/ext/mini/services/devicemanagerservice/src/auth/hichain_connector.cpp index 5e867efa0..6fed5fda6 100644 --- a/ext/mini/services/devicemanagerservice/src/auth/hichain_connector.cpp +++ b/ext/mini/services/devicemanagerservice/src/auth/hichain_connector.cpp @@ -141,7 +141,7 @@ int32_t HichainConnector::CreateGroup(int64_t requestId, const std::string &grou ret = deviceGroupManager_->createGroup(userId, requestId, DEVICE_MANAGER_APP.c_str(), jsonObj.dump().c_str()); if (ret != 0) { - DMLOG(DM_LOG_ERROR, "Faild to start CreateGroup task, ret: %d, requestId %lld.", ret, requestId); + DMLOG(DM_LOG_ERROR, "Failed to start CreateGroup task, ret: %d, requestId %lld.", ret, requestId); return ret; } @@ -176,12 +176,12 @@ int32_t HichainConnector::GetGroupInfo(std::string queryParams, std::vectorgetGroupInfo(userId, DEVICE_MANAGER_APP.c_str(), queryParams.c_str(), &groupVec, &num); if (ret != 0) { - DMLOG(DM_LOG_ERROR, "HichainConnector::GetGroupInfo faild , ret: %d.", ret); + DMLOG(DM_LOG_ERROR, "HichainConnector::GetGroupInfo failed , ret: %d.", ret); return false; } if (groupVec == nullptr) { - DMLOG(DM_LOG_ERROR, "HichainConnector::GetGroupInfo faild , returnGroups is nullptr"); + DMLOG(DM_LOG_ERROR, "HichainConnector::GetGroupInfo failed , returnGroups is nullptr"); return false; } @@ -333,12 +333,12 @@ void HichainConnector::GetRelatedGroups(std::string deviceId, std::vectorgetRelatedGroups(userId, DEVICE_MANAGER_APP.c_str(), deviceId.c_str(), &returnGroups, &groupNum); if (ret != 0) { - DMLOG(DM_LOG_ERROR, "HichainConnector::GetRelatedGroups faild , ret: %d.", ret); + DMLOG(DM_LOG_ERROR, "HichainConnector::GetRelatedGroups failed , ret: %d.", ret); return; } if (returnGroups == nullptr) { - DMLOG(DM_LOG_ERROR, "HichainConnector::GetRelatedGroups faild , returnGroups is nullptr"); + DMLOG(DM_LOG_ERROR, "HichainConnector::GetRelatedGroups failed , returnGroups is nullptr"); return; } @@ -422,7 +422,7 @@ int32_t HichainConnector::DelMemberFromGroup(std::string groupId, std::string de int32_t ret = deviceGroupManager_->deleteMemberFromGroup(userId, requestId, DEVICE_MANAGER_APP.c_str(), deleteParams.c_str()); if (ret != 0) { - DMLOG(DM_LOG_ERROR, "HichainConnector::DelMemberFromGroup faild , ret: %d.", ret); + DMLOG(DM_LOG_ERROR, "HichainConnector::DelMemberFromGroup failed , ret: %d.", ret); return ret; } return 0; @@ -443,7 +443,7 @@ void HichainConnector::DeleteGroup(std::string &groupId) ret = deviceGroupManager_->deleteGroup(userId, requestId, DEVICE_MANAGER_APP.c_str(), disbandParams.c_str()); if (ret != 0) { - DMLOG(DM_LOG_ERROR, "HichainConnector::DeleteGroup faild , ret: %d.", ret); + DMLOG(DM_LOG_ERROR, "HichainConnector::DeleteGroup failed , ret: %d.", ret); } } diff --git a/ext/mini/services/devicemanagerservice/src/dispatch/server_stub.cpp b/ext/mini/services/devicemanagerservice/src/dispatch/server_stub.cpp index bb83afe69..33c735790 100644 --- a/ext/mini/services/devicemanagerservice/src/dispatch/server_stub.cpp +++ b/ext/mini/services/devicemanagerservice/src/dispatch/server_stub.cpp @@ -57,7 +57,7 @@ static const char *GetName(Service *service) static BOOL Initialize(Service *service, Identity identity) { - if (service == NULL) { + if (service == nullptr) { DMLOG(DM_LOG_WARN, "invalid param"); return FALSE; } @@ -71,7 +71,7 @@ static BOOL Initialize(Service *service, Identity identity) static BOOL MessageHandle(Service *service, Request *request) { - if ((service == NULL) || (request == NULL)) { + if ((service == nullptr) || (request == nullptr)) { DMLOG(DM_LOG_WARN, "invalid param"); return FALSE; } @@ -85,9 +85,6 @@ static TaskConfig GetTaskConfig(Service *service) return config; } - - - static void DevMgrSvcInit(void) { sleep(WAIT_FOR_SERVER); @@ -96,9 +93,6 @@ static void DevMgrSvcInit(void) .Initialize = Initialize, .MessageHandle = MessageHandle, .GetTaskConfig = GetTaskConfig, - // SERVER_IPROXY_IMPL_BEGIN, - // .Invoke = OnRemoteRequest, - // IPROXY_END, }; if (!SAMGR_GetInstance()->RegisterService((Service *)&service)) { diff --git a/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp b/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp index e1a881b90..659df2210 100644 --- a/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp +++ b/interfaces/inner_kits/native_cpp/src/ipc/lite/ipc_cmd_parser.cpp @@ -229,7 +229,7 @@ ON_IPC_CMD(SERVER_DEVICE_STATE_NOTIFY, IpcIo &reply) DmDeviceState deviceState = static_cast(IpcIoPopInt32(&reply)); uint32_t size; const DmDeviceInfo *deviceInfo = (const DmDeviceInfo *)IpcIoPopFlatObj(&reply, &size); - if (pkgName == "" || len == 0 || deviceInfo == NULL) { + if (pkgName == "" || len == 0 || deviceInfo == nullptr) { LOGE("OnDeviceOnline, get para failed"); return; } @@ -256,7 +256,7 @@ ON_IPC_CMD(SERVER_DEVICE_FOUND, IpcIo &reply) uint16_t subscribeId = IpcIoPopUint16(&reply); uint32_t size; const DmDeviceInfo *deviceInfo = (const DmDeviceInfo *)IpcIoPopFlatObj(&reply, &size); - if (pkgName == "" || len == 0 || deviceInfo == NULL) { + if (pkgName == "" || len == 0 || deviceInfo == nullptr) { LOGE("OnDeviceChanged, get para failed"); return; } diff --git a/interfaces/inner_kits/native_cpp/src/ipc/standard/ipc_client_stub.cpp b/interfaces/inner_kits/native_cpp/src/ipc/standard/ipc_client_stub.cpp index aa022b55f..855de3b70 100644 --- a/interfaces/inner_kits/native_cpp/src/ipc/standard/ipc_client_stub.cpp +++ b/interfaces/inner_kits/native_cpp/src/ipc/standard/ipc_client_stub.cpp @@ -25,7 +25,7 @@ namespace OHOS { namespace DistributedHardware { int32_t IpcClientStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { - LOGI("code = %d, flags= %d.", code, option.GetFlags()); + LOGI("code = %u, flags= %d.", code, option.GetFlags()); auto remoteDescriptor = data.ReadInterfaceToken(); if (GetDescriptor() != remoteDescriptor) { LOGI("ReadInterfaceToken fail!"); @@ -36,7 +36,7 @@ int32_t IpcClientStub::OnRemoteRequest(uint32_t code, MessageParcel &data, Messa LOGE("on ipc cmd success"); return DM_OK; } - LOGW("unsupport code: %d", code); + LOGW("unsupport code: %u", code); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); } diff --git a/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp b/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp index 9d68e364f..89c945640 100644 --- a/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp +++ b/interfaces/inner_kits/native_cpp/src/notify/device_manager_notify.cpp @@ -238,7 +238,7 @@ void DeviceManagerNotify::OnDiscoverySuccess(const std::string &pkgName, uint16_ void DeviceManagerNotify::OnAuthResult(const std::string &pkgName, const std::string &deviceId, const std::string &token, uint32_t status, uint32_t reason) { - LOGI("DeviceManagerNotify::OnAuthResult pkgName:%s, status:%d, reason:%d", pkgName.c_str(), status, reason); + LOGI("DeviceManagerNotify::OnAuthResult pkgName:%s, status:%d, reason:%u", pkgName.c_str(), status, reason); std::lock_guard autoLock(lock_); if (authenticateCallback_.count(pkgName) == 0) { LOGE("DeviceManager OnAuthResult: no register authCallback for this package"); diff --git a/services/devicemanagerservice/src/dependency/hichain/hichain_connector.cpp b/services/devicemanagerservice/src/dependency/hichain/hichain_connector.cpp index dd4afeb86..b2a5bdfc1 100644 --- a/services/devicemanagerservice/src/dependency/hichain/hichain_connector.cpp +++ b/services/devicemanagerservice/src/dependency/hichain/hichain_connector.cpp @@ -161,7 +161,7 @@ int32_t HiChainConnector::GetGroupInfo(std::string queryParams, std::vectordestroyInfo(&groupVec); nlohmann::json jsonObject = nlohmann::json::parse(relatedGroups); @@ -188,7 +188,7 @@ int32_t HiChainConnector::GetGroupInfo(const int32_t userId, std::string queryPa return false; } if (groupVec == nullptr) { - LOGE("HiChainConnector::GetGroupInfo failed , returnGroups is nullptr"); + LOGE("HiChainConnector::GetGroupInfo failed , returnGroups is nullptr."); return false; } if (num == 0) { diff --git a/services/devicemanagerservice/src/dependency/timer/dm_timer.cpp b/services/devicemanagerservice/src/dependency/timer/dm_timer.cpp index c4f95b94e..0dadbdf98 100644 --- a/services/devicemanagerservice/src/dependency/timer/dm_timer.cpp +++ b/services/devicemanagerservice/src/dependency/timer/dm_timer.cpp @@ -126,9 +126,8 @@ int32_t DmTimer::CreateTimeFd() return DM_STATUS_FINISH; } LOGI("DmTimer %s creatTimeFd", mTimerName_.c_str()); - int ret = 0; - ret = pipe(mTimeFd_); + int ret = pipe(mTimeFd_); if (ret < 0) { LOGE("DmTimer %s CreateTimeFd fail:(%d) errno(%d)", mTimerName_.c_str(), ret, errno); return ret; diff --git a/services/devicemanagerservice/src/device_manager_service_listener.cpp b/services/devicemanagerservice/src/device_manager_service_listener.cpp index 432481830..c7f53eee4 100644 --- a/services/devicemanagerservice/src/device_manager_service_listener.cpp +++ b/services/devicemanagerservice/src/device_manager_service_listener.cpp @@ -46,7 +46,7 @@ void DeviceManagerServiceListener::OnDeviceStateChange(const std::string &pkgNam void DeviceManagerServiceListener::OnDeviceFound(const std::string &pkgName, uint16_t subscribeId, const DmDeviceInfo &info) { - LOGI("call OnDeviceFound for %s, originId %d, deviceId %s", pkgName.c_str(), subscribeId, + LOGI("call OnDeviceFound for %s, originId %hu, deviceId %s", pkgName.c_str(), subscribeId, GetAnonyString(std::string(info.deviceId)).c_str()); std::shared_ptr pReq = std::make_shared(); std::shared_ptr pRsp = std::make_shared(); diff --git a/services/devicemanagerservice/src/discovery/dm_discovery_manager.cpp b/services/devicemanagerservice/src/discovery/dm_discovery_manager.cpp index f4f0d6837..494214339 100644 --- a/services/devicemanagerservice/src/discovery/dm_discovery_manager.cpp +++ b/services/devicemanagerservice/src/discovery/dm_discovery_manager.cpp @@ -27,7 +27,7 @@ const int32_t SESSION_CANCEL_TIMEOUT = 0; static void TimeOut(void *data, DmTimer& timer) { - LOGE("time out "); + LOGE("time out"); DmDiscoveryManager *discoveryMgr = (DmDiscoveryManager *)data; if (discoveryMgr == nullptr) { LOGE("time out error"); diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp index e4373c2ad..18258ff4f 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp @@ -20,7 +20,7 @@ int32_t main(int32_t argc, char *argv[]) { (void)argc; (void)argv; - while (1) { + while (true) { pause(); } return 0; diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp index 1a09f1cb6..ebdc8241a 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp @@ -51,7 +51,7 @@ static int32_t DeathCb(const IpcContext *context, void *ipcMsg, IpcIo *data, voi (void)context; (void)ipcMsg; (void)data; - if (arg == NULL) { + if (arg == nullptr) { LOGE("package name is NULL."); return DM_INVALID_VALUE; } @@ -60,12 +60,12 @@ static int32_t DeathCb(const IpcContext *context, void *ipcMsg, IpcIo *data, voi if (IpcServerListenermgr::GetInstance().GetListenerByPkgName(pkgName, &svcId) != DM_OK) { LOGE("not found client by package name."); free(arg); - arg = NULL; + arg = nullptr; return DM_FAILED; } IpcServerListenermgr::GetInstance().UnregisterListener(pkgName); free(arg); - arg = NULL; + arg = nullptr; #ifdef __LINUX__ BinderRelease(svcId.ipcCtx, svcId.handle); #endif @@ -83,7 +83,7 @@ int32_t RegisterDeviceManagerListener(IpcIo *req, IpcIo *reply) size_t len = 0; uint8_t *name = IpcIoPopString(req, &len); SvcIdentity *svc = IpcIoPopSvc(req); - if (name == NULL || svc == NULL || len == 0) { + if (name == nullptr || svc == nullptr || len == 0) { LOGE("get para failed"); return DM_INVALID_VALUE; } @@ -98,7 +98,7 @@ int32_t RegisterDeviceManagerListener(IpcIo *req, IpcIo *reply) svcId.ipcCtx = svc->ipcContext; BinderAcquire(svcId.ipcCtx, svcId.handle); free(svc); - svc = NULL; + svc = nullptr; #endif if (len == 0 || len > MALLOC_MAX_LEN) { LOGE("malloc length invalid!"); @@ -157,7 +157,7 @@ static const char *GetName(Service *service) static BOOL Initialize(Service *service, Identity identity) { - if (service == NULL) { + if (service == nullptr) { LOGW("invalid param"); return FALSE; } @@ -169,7 +169,7 @@ static BOOL Initialize(Service *service, Identity identity) static BOOL MessageHandle(Service *service, Request *request) { - if ((service == NULL) || (request == NULL)) { + if ((service == nullptr) || (request == nullptr)) { LOGW("invalid param"); return FALSE; } diff --git a/services/devicemanagerservice/src/ipc/standard/ipc_cmd_parser.cpp b/services/devicemanagerservice/src/ipc/standard/ipc_cmd_parser.cpp index 42654f175..3feaaadf8 100644 --- a/services/devicemanagerservice/src/ipc/standard/ipc_cmd_parser.cpp +++ b/services/devicemanagerservice/src/ipc/standard/ipc_cmd_parser.cpp @@ -108,6 +108,10 @@ ON_IPC_SET_REQUEST(SERVER_DISCOVER_FINISH, std::shared_ptr pBaseReq, Mes ON_IPC_READ_RESPONSE(SERVER_DISCOVER_FINISH, MessageParcel &reply, std::shared_ptr pBaseRsp) { + if (pBaseRsp == nullptr) { + LOGE("pBaseRsp is null"); + return DM_FAILED; + } pBaseRsp->SetErrCode(reply.ReadInt32()); return DM_OK; } diff --git a/services/devicemanagerservice/src/ipc/standard/ipc_server_stub.cpp b/services/devicemanagerservice/src/ipc/standard/ipc_server_stub.cpp index 30f37fc6b..762ff63ea 100644 --- a/services/devicemanagerservice/src/ipc/standard/ipc_server_stub.cpp +++ b/services/devicemanagerservice/src/ipc/standard/ipc_server_stub.cpp @@ -80,7 +80,7 @@ void IpcServerStub::OnStop() int32_t IpcServerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { - LOGI("code = %d, flags= %d.", code, option.GetFlags()); + LOGI("code = %u, flags= %d.", code, option.GetFlags()); auto remoteDescriptor = data.ReadInterfaceToken(); if (GetDescriptor() != remoteDescriptor) { LOGI("ReadInterfaceToken fail!"); diff --git a/utils/src/dm_random.cpp b/utils/src/dm_random.cpp index 7a1d6a716..738d33442 100644 --- a/utils/src/dm_random.cpp +++ b/utils/src/dm_random.cpp @@ -70,7 +70,7 @@ int32_t GetRandomData(uint8_t *randStr, uint32_t len) break; } ret = DM_OK; - } while (0); + } while (false); if (entropy != nullptr) { free(entropy); } @@ -91,9 +91,9 @@ bool MbedtlsGenRandomStr(char *szOut, int32_t szOutLen, bool numberOnly) const int32_t NUMBER_COUNT = 10; const int32_t ALPHA_COUNT = 26; const int32_t ALPHA_BYTE_COUNT = 2; - int32_t M = numberOnly ? NUMBER_COUNT : (NUMBER_COUNT + ALPHA_BYTE_COUNT * ALPHA_COUNT); + int32_t tmpNum = numberOnly ? NUMBER_COUNT : (NUMBER_COUNT + ALPHA_BYTE_COUNT * ALPHA_COUNT); for (int32_t i = 0; i < szOutLen; i++) { - uint32_t idx = ((uint32_t)szOut[i] % M); + uint32_t idx = ((uint32_t)szOut[i] % tmpNum); char base; if (idx < NUMBER_COUNT) { base = '0'; -- Gitee From 5e80b932d543f84dd0fcc5fdf4a83690d1b290e7 Mon Sep 17 00:00:00 2001 From: zixing000 Date: Sat, 12 Mar 2022 14:57:21 +0800 Subject: [PATCH 09/19] L1 StartDeviceDiscovery ok. Signed-off-by: zixing000 --- services/devicemanagerservice/BUILD.gn | 2 ++ .../src/dependency/softbus/softbus_connector.cpp | 11 ++++++++--- .../src/device_manager_service_listener.cpp | 1 + .../src/ipc/lite/ipc_server_main.cpp | 9 ++++----- .../src/ipc/lite/ipc_server_stub.cpp | 2 +- test_lite/device_manager_test.cpp | 15 ++------------- utils/BUILD.gn | 2 ++ 7 files changed, 20 insertions(+), 22 deletions(-) diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index d27f08b0d..28c457b24 100755 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -42,6 +42,7 @@ if (defined(ohos_lite)) { "${common_path}/include/ipc/model", "${utils_path}/include", "${utils_path}/include/ipc/lite", + "${utils_path}/include/permission/lite", "${innerkits_path}/native_cpp/include", "${innerkits_path}/native_cpp/include/ipc", "${innerkits_path}/native_cpp/include/ipc/lite", @@ -105,6 +106,7 @@ if (defined(ohos_lite)) { "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", "//base/security/deviceauth/services:deviceauth_sdk", "//base/startup/syspara_lite/frameworks/parameter/src:sysparam", + # "//base/startup/syspara_lite/interfaces/innerkits/native/syspara:syspara_watchagent", "//foundation/communication/dsoftbus/sdk:softbus_client", "//foundation/communication/ipc_lite:liteipc_adapter", "//foundation/distributedschedule/samgr_lite/samgr:samgr", diff --git a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp index 9bbfbd055..3903c4576 100644 --- a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp +++ b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp @@ -98,7 +98,6 @@ int32_t SoftbusConnector::Init() } while (ret != DM_OK); LOGI("RegNodeDeviceStateCb success."); -#ifndef LITE_DEVICE PublishInfo dmPublishInfo; dmPublishInfo.publishId = DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID; dmPublishInfo.mode = DiscoverMode::DISCOVER_MODE_ACTIVE; @@ -132,9 +131,15 @@ int32_t SoftbusConnector::Init() } LOGI("service unpublish result is : %d", ret); } - +#ifdef LITE_DEVICE + ret = PublishService(DM_PKG_NAME.c_str(), &dmPublishInfo, &softbusPublishCallback_); + if (ret == DM_OK) { + publishStatus = ALLOW_BE_DISCOVERY; + } + LOGI("service publish result is : %d", ret); +#else ret = WatchParameter(DISCOVER_STATUS_KEY.c_str(), &SoftbusConnector::OnParameterChgCallback, nullptr); - LOGI("register Watch Parameter result is : %d"); + LOGI("register Watch Parameter result is : %d", ret); #endif return ret; } diff --git a/services/devicemanagerservice/src/device_manager_service_listener.cpp b/services/devicemanagerservice/src/device_manager_service_listener.cpp index 108fefb2e..cd6d1acbe 100644 --- a/services/devicemanagerservice/src/device_manager_service_listener.cpp +++ b/services/devicemanagerservice/src/device_manager_service_listener.cpp @@ -89,6 +89,7 @@ void DeviceManagerServiceListener::OnAuthResult(const std::string &pkgName, cons pReq->SetToken(token); pReq->SetStatus(status); pReq->SetReason(reason); + LOGI("%s, before send request +++++++++++", __FUNCTION__); ipcServerListener_.SendRequest(SERVER_AUTH_RESULT, pReq, pRsp); } diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp index 05f742251..a4badd7b3 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_server_main.cpp @@ -31,11 +31,10 @@ static void InitAll() LOGI("IpcServerStubInit failed"); return; } - DeviceManagerService::GetInstance().Init(); - // if (IpcServerAdapter::GetInstance().ModuleInit() != DM_OK) { - // LOGI("module init failed"); - // return; - // } + if (DeviceManagerService::GetInstance().Init() != DM_OK) { + LOGI("DeviceManagerServic init failed"); + return; + } LOGI("DM ipc server Init success"); } diff --git a/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp b/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp index 223faf210..4d329341e 100644 --- a/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp +++ b/services/devicemanagerservice/src/ipc/lite/ipc_server_stub.cpp @@ -65,7 +65,7 @@ static int32_t DeathCb(const IpcContext *context, void *ipcMsg, IpcIo *data, voi } IpcServerListenermgr::GetInstance().UnregisterListener(pkgName); free(arg); - arg = NULL; + arg = nullptr; #ifdef __LINUX__ BinderRelease(svcId.ipcCtx, svcId.handle); #endif diff --git a/test_lite/device_manager_test.cpp b/test_lite/device_manager_test.cpp index 7e60f67cd..abc537f33 100644 --- a/test_lite/device_manager_test.cpp +++ b/test_lite/device_manager_test.cpp @@ -296,20 +296,9 @@ int main(){ } else if (cmd == "UnInitDeviceManager") { UnInitDeviceManager(); } else if (cmd == "InputEncryptText") { - // std::string plainText = ""; - // std::cin >> plainText; - // int32_t outLen = 0; - // memset_s(g_buf, BUF_SIZE, 0, BUF_SIZE); - // EncryptUtils::MbedtlsEncrypt((const uint8_t*)encryptText.c_str(), encryptText.size(), - // g_buf, encryptText.size(), &outLen); - LOGI("EncryptText:%s\n", g_buf); + LOGI("EncryptText:InputEncryptText unsupport."); } else if (cmd == "DecryptTexit") { - // int32_t outLen = 0; - // std::string encryptText = (const char*)g_buf; - // memset_s(g_buf, BUF_SIZE, 0, BUF_SIZE); - // EncryptUtils::MbedtlsDecrypt((const uint8_t*)encryptText.c_str(), encryptText.size(), - // g_buf, encryptText.size(), &outLen); - LOGI("PlainText:%s\n", g_buf); + LOGI("EncryptText:DecryptTexit unsupport."); } else if (cmd == "Exit") { break; } else { diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 65737fcbf..9be9bf7ff 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -27,6 +27,7 @@ if (defined(ohos_lite)) { "${common_path}/include/ipc/model", "include", "include/ipc/lite", + "include/permission/lite", ] include_dirs += [ "//base/security/deviceauth/interfaces/innerkits", @@ -49,6 +50,7 @@ if (defined(ohos_lite)) { "src/dm_log.cpp", "src/dm_random.cpp", "src/ipc/lite/ipc_cmd_register.cpp", + "src/permission/lite/permission_manager.cpp", ] defines = [ "hI_LOG_ENABLE", -- Gitee From 716baf4547fa0badaed2e47145c92ea8917b8e24 Mon Sep 17 00:00:00 2001 From: sin_dzzeng <13277932042@163.com> Date: Mon, 14 Mar 2022 15:25:06 +0800 Subject: [PATCH 10/19] set dm start after softbus Signed-off-by: sin_dzzeng <13277932042@163.com> --- sa_profile/4802.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sa_profile/4802.xml b/sa_profile/4802.xml index d2e77008e..7290f18bf 100644 --- a/sa_profile/4802.xml +++ b/sa_profile/4802.xml @@ -18,7 +18,7 @@ 4802 libdevicemanagerservice.z.so - + 4700 true false -- Gitee From ce575e7773dc520e907832e0bc22dfc9b52e5daa Mon Sep 17 00:00:00 2001 From: lcaidm Date: Mon, 14 Mar 2022 18:27:44 +0800 Subject: [PATCH 11/19] =?UTF-8?q?ui=E4=BD=8D=E7=BD=AE/=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lcaidm --- .../include/dialog_ui/js/common/pincode.png | Bin 35390 -> 0 bytes .../dialog_ui/js/BUILD.gn | 2 +- .../dialog_ui/js/i18n/en-US.json | 0 .../dialog_ui/js/i18n/zh-CN.json | 0 .../dialog_ui/js/pages/index/index.css | 4 +- .../dialog_ui/js/pages/index/index.hml | 4 +- .../dialog_ui/js/pages/index/index.js | 1 - .../dialog_ui/js/common/KeyBoard.js | 86 ------------------ .../dialog_ui/js/common/index.hml | 32 ------- .../dialog_ui/js/common/pincode.png | Bin 35390 -> 0 bytes ext/pin_auth/BUILD.gn | 4 +- .../input_pin_dialog/dialog_ui/js/BUILD.gn | 2 +- .../dialog_ui/js/i18n/en-US.json | 0 .../dialog_ui/js/i18n/zh-CN.json | 0 .../dialog_ui/js/pages/index/index.css | 4 +- .../dialog_ui/js/pages/index/index.hml | 4 +- .../dialog_ui/js/pages/index/index.js | 11 +-- .../show_pin_dialog/dialog_ui/js/BUILD.gn | 2 +- .../dialog_ui/js/i18n/en-US.json | 0 .../dialog_ui/js/i18n/zh-CN.json | 0 .../dialog_ui/js/pages/index/index.css | 2 +- .../dialog_ui/js/pages/index/index.hml | 2 +- .../dialog_ui/js/pages/index/index.js | 1 - .../dialog_ui/js/common/pincode.png | Bin 35390 -> 0 bytes services/devicemanagerservice/BUILD.gn | 2 +- 25 files changed, 21 insertions(+), 142 deletions(-) delete mode 100644 common/include/dialog_ui/js/common/pincode.png rename common/include/{ => show_confirm_dialog}/dialog_ui/js/BUILD.gn (95%) rename common/include/{ => show_confirm_dialog}/dialog_ui/js/i18n/en-US.json (100%) rename common/include/{ => show_confirm_dialog}/dialog_ui/js/i18n/zh-CN.json (100%) rename common/include/{ => show_confirm_dialog}/dialog_ui/js/pages/index/index.css (95%) rename common/include/{ => show_confirm_dialog}/dialog_ui/js/pages/index/index.hml (68%) rename common/include/{ => show_confirm_dialog}/dialog_ui/js/pages/index/index.js (93%) delete mode 100644 ext/input_pin_dialog/dialog_ui/js/common/KeyBoard.js delete mode 100644 ext/input_pin_dialog/dialog_ui/js/common/index.hml delete mode 100644 ext/input_pin_dialog/dialog_ui/js/common/pincode.png rename ext/{ => pin_auth}/input_pin_dialog/dialog_ui/js/BUILD.gn (95%) rename ext/{ => pin_auth}/input_pin_dialog/dialog_ui/js/i18n/en-US.json (100%) rename ext/{ => pin_auth}/input_pin_dialog/dialog_ui/js/i18n/zh-CN.json (100%) rename ext/{ => pin_auth}/input_pin_dialog/dialog_ui/js/pages/index/index.css (96%) rename ext/{ => pin_auth}/input_pin_dialog/dialog_ui/js/pages/index/index.hml (79%) rename ext/{ => pin_auth}/input_pin_dialog/dialog_ui/js/pages/index/index.js (74%) rename ext/{ => pin_auth}/show_pin_dialog/dialog_ui/js/BUILD.gn (95%) rename ext/{ => pin_auth}/show_pin_dialog/dialog_ui/js/i18n/en-US.json (100%) rename ext/{ => pin_auth}/show_pin_dialog/dialog_ui/js/i18n/zh-CN.json (100%) rename ext/{ => pin_auth}/show_pin_dialog/dialog_ui/js/pages/index/index.css (97%) rename ext/{ => pin_auth}/show_pin_dialog/dialog_ui/js/pages/index/index.hml (83%) rename ext/{ => pin_auth}/show_pin_dialog/dialog_ui/js/pages/index/index.js (83%) delete mode 100644 ext/show_pin_dialog/dialog_ui/js/common/pincode.png diff --git a/common/include/dialog_ui/js/common/pincode.png b/common/include/dialog_ui/js/common/pincode.png deleted file mode 100644 index 6616f7659fcf1d5da5ab6796863e32efbe086cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35390 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 yx3z8dISCp1c(R0000b; diff --git a/common/include/dialog_ui/js/BUILD.gn b/common/include/show_confirm_dialog/dialog_ui/js/BUILD.gn similarity index 95% rename from common/include/dialog_ui/js/BUILD.gn rename to common/include/show_confirm_dialog/dialog_ui/js/BUILD.gn index 0792bde29..d360a0610 100644 --- a/common/include/dialog_ui/js/BUILD.gn +++ b/common/include/show_confirm_dialog/dialog_ui/js/BUILD.gn @@ -15,7 +15,7 @@ import("//foundation/ace/ace_engine/build/ace_gen_sa_dialog_js.gni") import("//foundation/distributedhardware/devicemanager/devicemanager.gni") gen_sa_dialog_js("dialog_js_files_etc") { - project_path = "//foundation/distributedhardware/devicemanager/common/include/dialog_ui/js" + project_path = "//foundation/distributedhardware/devicemanager/common/include/show_confirm_dialog/dialog_ui/js" dialog_name = "config_dialog_service" part_name = "device_manager_base" subsystem_name = "distributedhardware" diff --git a/common/include/dialog_ui/js/i18n/en-US.json b/common/include/show_confirm_dialog/dialog_ui/js/i18n/en-US.json similarity index 100% rename from common/include/dialog_ui/js/i18n/en-US.json rename to common/include/show_confirm_dialog/dialog_ui/js/i18n/en-US.json diff --git a/common/include/dialog_ui/js/i18n/zh-CN.json b/common/include/show_confirm_dialog/dialog_ui/js/i18n/zh-CN.json similarity index 100% rename from common/include/dialog_ui/js/i18n/zh-CN.json rename to common/include/show_confirm_dialog/dialog_ui/js/i18n/zh-CN.json diff --git a/common/include/dialog_ui/js/pages/index/index.css b/common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.css similarity index 95% rename from common/include/dialog_ui/js/pages/index/index.css rename to common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.css index 6a57d7386..72630ca51 100644 --- a/common/include/dialog_ui/js/pages/index/index.css +++ b/common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.css @@ -18,7 +18,7 @@ height: 100px; } -.but1 { +.but-cancel { width: 70%; height: 80px; font-size: 40px; @@ -26,7 +26,7 @@ border-radius: 50px; } -.but2 { +.but-confirm { width: 30%; height: 80px; font-size: 40px; diff --git a/common/include/dialog_ui/js/pages/index/index.hml b/common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.hml similarity index 68% rename from common/include/dialog_ui/js/pages/index/index.hml rename to common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.hml index 4a689e272..8ce5443f5 100644 --- a/common/include/dialog_ui/js/pages/index/index.hml +++ b/common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.hml @@ -6,10 +6,10 @@ 用于分享图片
- -
diff --git a/common/include/dialog_ui/js/pages/index/index.js b/common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.js similarity index 93% rename from common/include/dialog_ui/js/pages/index/index.js rename to common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.js index f579f6a3e..13a4384c5 100644 --- a/common/include/dialog_ui/js/pages/index/index.js +++ b/common/include/show_confirm_dialog/dialog_ui/js/pages/index/index.js @@ -3,7 +3,6 @@ import router from '@ohos.router' var timel = null; export default { data: { - message: router.getParams().targetPkgName, seconds:60, }, onInit() { diff --git a/ext/input_pin_dialog/dialog_ui/js/common/KeyBoard.js b/ext/input_pin_dialog/dialog_ui/js/common/KeyBoard.js deleted file mode 100644 index c3234a50d..000000000 --- a/ext/input_pin_dialog/dialog_ui/js/common/KeyBoard.js +++ /dev/null @@ -1,86 +0,0 @@ - -;(function(exports){ - var KeyBoard = function(input, options){ - var body = document.getElementsByTagName('body')[0]; - var DIV_ID = options && options.divId || '__w_l_h_v_c_z_e_r_o_divid'; - - if(document.getElementById(DIV_ID)){ - body.removeChild(document.getElementById(DIV_ID)); - } - - this.input = input; - this.el = document.createElement('div'); - - var self = this; - var zIndex = options && options.zIndex || 1000; - var width = options && options.width || '100%'; - var height = options && options.height || '193px'; - var fontSize = options && options.fontSize || '15px'; - var backgroundColor = options && options.backgroundColor || '#fff'; - var TABLE_ID = options && options.table_id || 'table_0909099'; - var mobile = typeof orientation !== 'undefined'; - - this.el.id = DIV_ID; - this.el.style.position = 'absolute'; - this.el.style.left = 0; - this.el.style.right = 0; - this.el.style.bottom = 0; - this.el.style.zIndex = zIndex; - this.el.style.width = width; - this.el.style.height = height; - this.el.style.backgroundColor = backgroundColor; - - //样式 - var cssStr = ''; - - //Button - var btnStr = '
完成
'; - - //table - var tableStr = ''; - tableStr += ''; - tableStr += ''; - tableStr += ''; - tableStr += ''; - tableStr += ''; - tableStr += '
123
456
789
.0删除
'; - this.el.innerHTML = cssStr + btnStr + tableStr; - - function addEvent(e){ - var ev = e || window.event; - var clickEl = ev.element || ev.target; - var value = clickEl.textContent || clickEl.innerText; - if(clickEl.tagName.toLocaleLowerCase() === 'td' && value !== "删除"){ - if(self.input){ - self.input.value += value; - } - }else if(clickEl.tagName.toLocaleLowerCase() === 'div' && value === "完成"){ - body.removeChild(self.el); - }else if(clickEl.tagName.toLocaleLowerCase() === 'td' && value === "删除"){ - var num = self.input.value; - if(num){ - var newNum = num.substr(0, num.length - 1); - self.input.value = newNum; - } - } - } - - if(mobile){ - this.el.ontouchstart = addEvent; - }else{ - this.el.onclick = addEvent; - } - body.appendChild(this.el); - } - - exports.KeyBoard = KeyBoard; - -})(window); \ No newline at end of file diff --git a/ext/input_pin_dialog/dialog_ui/js/common/index.hml b/ext/input_pin_dialog/dialog_ui/js/common/index.hml deleted file mode 100644 index 3566d9ba2..000000000 --- a/ext/input_pin_dialog/dialog_ui/js/common/index.hml +++ /dev/null @@ -1,32 +0,0 @@ -
- - PIN码连接 - - - 请输入另一个设备显示的PIN码进行验证 - - - - - PIN码输入错误,请重新输入 - -
- - -
- - - -
diff --git a/ext/input_pin_dialog/dialog_ui/js/common/pincode.png b/ext/input_pin_dialog/dialog_ui/js/common/pincode.png deleted file mode 100644 index 6616f7659fcf1d5da5ab6796863e32efbe086cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35390 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 yx3z8dISCp1c(R0000b; diff --git a/ext/pin_auth/BUILD.gn b/ext/pin_auth/BUILD.gn index d12332a47..84e735198 100644 --- a/ext/pin_auth/BUILD.gn +++ b/ext/pin_auth/BUILD.gn @@ -65,8 +65,8 @@ if (defined(ohos_lite)) { ] deps = [ - "${ext_path}/input_pin_dialog/dialog_ui/js:dialog_js_files_etc", - "${ext_path}/show_pin_dialog/dialog_ui/js:dialog_js_files_etc", + "${ext_path}/pin_auth/input_pin_dialog/dialog_ui/js:dialog_js_files_etc", + "${ext_path}/pin_auth/show_pin_dialog/dialog_ui/js:dialog_js_files_etc", "${innerkits_path}/native_cpp:devicemanagersdk", "${utils_path}:devicemanagerutils", "//base/security/deviceauth/services:deviceauth_sdk", diff --git a/ext/input_pin_dialog/dialog_ui/js/BUILD.gn b/ext/pin_auth/input_pin_dialog/dialog_ui/js/BUILD.gn similarity index 95% rename from ext/input_pin_dialog/dialog_ui/js/BUILD.gn rename to ext/pin_auth/input_pin_dialog/dialog_ui/js/BUILD.gn index 8abf88695..a343c353f 100644 --- a/ext/input_pin_dialog/dialog_ui/js/BUILD.gn +++ b/ext/pin_auth/input_pin_dialog/dialog_ui/js/BUILD.gn @@ -15,7 +15,7 @@ import("//foundation/ace/ace_engine/build/ace_gen_sa_dialog_js.gni") import("//foundation/distributedhardware/devicemanager/devicemanager.gni") gen_sa_dialog_js("dialog_js_files_etc") { - project_path = "//foundation/distributedhardware/devicemanager/ext/input_pin_dialog/dialog_ui/js" + project_path = "//foundation/distributedhardware/devicemanager/ext/pin_auth/input_pin_dialog/dialog_ui/js" dialog_name = "input_pin_service" part_name = "device_manager_base" subsystem_name = "distributedhardware" diff --git a/ext/input_pin_dialog/dialog_ui/js/i18n/en-US.json b/ext/pin_auth/input_pin_dialog/dialog_ui/js/i18n/en-US.json similarity index 100% rename from ext/input_pin_dialog/dialog_ui/js/i18n/en-US.json rename to ext/pin_auth/input_pin_dialog/dialog_ui/js/i18n/en-US.json diff --git a/ext/input_pin_dialog/dialog_ui/js/i18n/zh-CN.json b/ext/pin_auth/input_pin_dialog/dialog_ui/js/i18n/zh-CN.json similarity index 100% rename from ext/input_pin_dialog/dialog_ui/js/i18n/zh-CN.json rename to ext/pin_auth/input_pin_dialog/dialog_ui/js/i18n/zh-CN.json diff --git a/ext/input_pin_dialog/dialog_ui/js/pages/index/index.css b/ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.css similarity index 96% rename from ext/input_pin_dialog/dialog_ui/js/pages/index/index.css rename to ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.css index 7a13cd6ce..7a310c950 100644 --- a/ext/input_pin_dialog/dialog_ui/js/pages/index/index.css +++ b/ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.css @@ -37,7 +37,7 @@ height: 100px; } -.but1 { +.but-cancel { width: 30%; height: 80px; font-size: 40px; @@ -46,7 +46,7 @@ border-radius: 50px; } -.but2 { +.but-confirm { width: 30%; height: 80px; font-size: 40px; diff --git a/ext/input_pin_dialog/dialog_ui/js/pages/index/index.hml b/ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.hml similarity index 79% rename from ext/input_pin_dialog/dialog_ui/js/pages/index/index.hml rename to ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.hml index 84f217637..53558da90 100644 --- a/ext/input_pin_dialog/dialog_ui/js/pages/index/index.hml +++ b/ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.hml @@ -10,10 +10,10 @@ PIN码输入错误,请重新输入(3次:还有{{isTimes}}次机会)
- -
diff --git a/ext/input_pin_dialog/dialog_ui/js/pages/index/index.js b/ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.js similarity index 74% rename from ext/input_pin_dialog/dialog_ui/js/pages/index/index.js rename to ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.js index 514b6ec77..488972d50 100644 --- a/ext/input_pin_dialog/dialog_ui/js/pages/index/index.js +++ b/ext/pin_auth/input_pin_dialog/dialog_ui/js/pages/index/index.js @@ -19,22 +19,21 @@ export default { onConfirm() { numbs = numbs + 1; if(numbs <= 3){ - console.info('click cancel numbs < 3 '); - console.info('code: ' + code); - console.info('inputVal: ' + inputVal); + console.info('click confirm numbs < 3 '); if(code == inputVal){ - console.info('click cancel code == inputVal'); + console.info('click confirm code == inputVal'); callNativeHandler("EVENT_INPUT", "0"); }else{ if(numbs == 3){ + console.info('click confirm code != inputVal and numbs == 3'); callNativeHandler("EVENT_CONFIRM", "1"); } - console.info('click cancel code != inputVal'); + console.info('click confirm code != inputVal'); this.isShow = true; this.isTimes = 3 - numbs; } }else{ - console.info('click cancel numbs > 3 '); + console.info('click confirm numbs > 3 '); callNativeHandler("EVENT_CONFIRM", "1"); } }, diff --git a/ext/show_pin_dialog/dialog_ui/js/BUILD.gn b/ext/pin_auth/show_pin_dialog/dialog_ui/js/BUILD.gn similarity index 95% rename from ext/show_pin_dialog/dialog_ui/js/BUILD.gn rename to ext/pin_auth/show_pin_dialog/dialog_ui/js/BUILD.gn index 6fab0d22c..24e859e1e 100644 --- a/ext/show_pin_dialog/dialog_ui/js/BUILD.gn +++ b/ext/pin_auth/show_pin_dialog/dialog_ui/js/BUILD.gn @@ -16,7 +16,7 @@ import("//foundation/distributedhardware/devicemanager/devicemanager.gni") gen_sa_dialog_js("dialog_js_files_etc") { if (!device_manager_base_no_interaction_auth) { - project_path = "//foundation/distributedhardware/devicemanager/ext/show_pin_dialog/dialog_ui/js" + project_path = "//foundation/distributedhardware/devicemanager/ext/pin_auth/show_pin_dialog/dialog_ui/js" } dialog_name = "show_pin_service" part_name = "device_manager_base" diff --git a/ext/show_pin_dialog/dialog_ui/js/i18n/en-US.json b/ext/pin_auth/show_pin_dialog/dialog_ui/js/i18n/en-US.json similarity index 100% rename from ext/show_pin_dialog/dialog_ui/js/i18n/en-US.json rename to ext/pin_auth/show_pin_dialog/dialog_ui/js/i18n/en-US.json diff --git a/ext/show_pin_dialog/dialog_ui/js/i18n/zh-CN.json b/ext/pin_auth/show_pin_dialog/dialog_ui/js/i18n/zh-CN.json similarity index 100% rename from ext/show_pin_dialog/dialog_ui/js/i18n/zh-CN.json rename to ext/pin_auth/show_pin_dialog/dialog_ui/js/i18n/zh-CN.json diff --git a/ext/show_pin_dialog/dialog_ui/js/pages/index/index.css b/ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.css similarity index 97% rename from ext/show_pin_dialog/dialog_ui/js/pages/index/index.css rename to ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.css index ad2c2c416..8ce639b24 100644 --- a/ext/show_pin_dialog/dialog_ui/js/pages/index/index.css +++ b/ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.css @@ -23,7 +23,7 @@ font-weight: 800; } -.but { +.but-confirm { width: 30%; font-size: 40px; height: 80px; diff --git a/ext/show_pin_dialog/dialog_ui/js/pages/index/index.hml b/ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.hml similarity index 83% rename from ext/show_pin_dialog/dialog_ui/js/pages/index/index.hml rename to ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.hml index 9cb650aef..845c99e57 100644 --- a/ext/show_pin_dialog/dialog_ui/js/pages/index/index.hml +++ b/ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.hml @@ -8,7 +8,7 @@ {{ pincode }} - \ No newline at end of file diff --git a/ext/show_pin_dialog/dialog_ui/js/pages/index/index.js b/ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.js similarity index 83% rename from ext/show_pin_dialog/dialog_ui/js/pages/index/index.js rename to ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.js index 3a55ac1cc..598deca1f 100644 --- a/ext/show_pin_dialog/dialog_ui/js/pages/index/index.js +++ b/ext/pin_auth/show_pin_dialog/dialog_ui/js/pages/index/index.js @@ -5,7 +5,6 @@ export default { pincode: router.getParams().pinCode, }, onInit() { - console.info('getParams: ' + router.getParams()); callNativeHandler("EVENT_CONFIRM", "0"); }, onConfirm() { diff --git a/ext/show_pin_dialog/dialog_ui/js/common/pincode.png b/ext/show_pin_dialog/dialog_ui/js/common/pincode.png deleted file mode 100644 index 6616f7659fcf1d5da5ab6796863e32efbe086cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35390 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 yx3z8dISCp1c(R0000b; diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index 7e720ba2a..8ea80487d 100755 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -104,7 +104,7 @@ if (defined(ohos_lite)) { if (!device_manager_base_no_interaction_auth) { deps += [ - "${common_path}/include/dialog_ui/js:dialog_js_files_etc", + "${common_path}/include/show_confirm_dialog/dialog_ui/js:dialog_js_files_etc", "//foundation/ace/ace_engine/interfaces/innerkits/ui_service_manager:ui_service_mgr", "//foundation/windowmanager/wm:libwm", ] -- Gitee From 72f5d8f941f1cfe1e37ad73f3547ad6be747f6e9 Mon Sep 17 00:00:00 2001 From: zixing000 Date: Tue, 15 Mar 2022 11:42:19 +0800 Subject: [PATCH 12/19] format_check Signed-off-by: zixing000 --- interfaces/inner_kits/native_cpp/BUILD.gn | 1 - services/devicemanagerservice/BUILD.gn | 1 - test_lite/BUILD.gn | 7 ++----- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/interfaces/inner_kits/native_cpp/BUILD.gn b/interfaces/inner_kits/native_cpp/BUILD.gn index 4d0f896d8..80fde4c73 100644 --- a/interfaces/inner_kits/native_cpp/BUILD.gn +++ b/interfaces/inner_kits/native_cpp/BUILD.gn @@ -58,7 +58,6 @@ if (defined(ohos_lite)) { "//foundation/distributedschedule/samgr_lite/samgr:samgr", "//third_party/bounds_checking_function:libsec_shared", "//utils/native/lite:utils", - # "//foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite/js/builtin:capability_api", ] defines = [ "LITE_DEVICE", diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index 51184684f..b869f6bdb 100755 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -106,7 +106,6 @@ if (defined(ohos_lite)) { "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", "//base/security/deviceauth/services:deviceauth_sdk", "//base/startup/syspara_lite/frameworks/parameter/src:sysparam", - # "//base/startup/syspara_lite/interfaces/innerkits/native/syspara:syspara_watchagent", "//foundation/communication/dsoftbus/sdk:softbus_client", "//foundation/communication/ipc_lite:liteipc_adapter", "//foundation/distributedschedule/samgr_lite/samgr:samgr", diff --git a/test_lite/BUILD.gn b/test_lite/BUILD.gn index c832f9731..56907720e 100644 --- a/test_lite/BUILD.gn +++ b/test_lite/BUILD.gn @@ -35,21 +35,18 @@ if (defined(ohos_lite)) { "//foundation/distributedschedule/samgr_lite/interfaces/kits/samgr", "//foundation/distributedschedule/samgr_lite/interfaces/kits/registry", ] - sources = [ - "device_manager_test.cpp", - ] + sources = [ "device_manager_test.cpp" ] defines = [ "LITE_DEVICE", "HI_LOG_ENABLE", "DH_LOG_TAG=\"devicemanagerservice\"", "LOG_DOMAIN=0xD004100", ] - # cflags_cc = build_flags; deps = [ "${innerkits_path}/native_cpp:devicemanagersdk", "${utils_path}:devicemanagerutils", - "//utils/native/lite:utils", "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//utils/native/lite:utils", ] } } -- Gitee From 20c14d4b80d6e32b2962493781cb630962a5aaab Mon Sep 17 00:00:00 2001 From: zixing000 Date: Tue, 15 Mar 2022 15:17:41 +0800 Subject: [PATCH 13/19] codecheck Signed-off-by: zixing000 --- .../src/authentication/dm_auth_manager.cpp | 4 - .../dependency/softbus/softbus_connector.cpp | 1 - test_lite/device_manager_test.cpp | 73 +++++++++---------- 3 files changed, 36 insertions(+), 42 deletions(-) diff --git a/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp b/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp index 466da03f7..2fbc08b3d 100644 --- a/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp +++ b/services/devicemanagerservice/src/authentication/dm_auth_manager.cpp @@ -606,18 +606,14 @@ void DmAuthManager::AuthenticateFinish() } else { authRequestContext_->reason = authResponseContext_->reply; } - #ifndef LITE_DEVICE if (authResponseContext_->state == AuthState::AUTH_REQUEST_INPUT) { Ace::UIServiceMgrClient::GetInstance()->CancelDialog(authResponseContext_->pageId); } #endif - listener_->OnAuthResult(authRequestContext_->hostPkgName, authRequestContext_->deviceId, authRequestContext_->token, authResponseContext_->state, authRequestContext_->reason); - softbusConnector_->GetSoftbusSession()->CloseAuthSession(authRequestContext_->sessionId); - if (!timerMap_.empty()) { for (auto &iter : timerMap_) { iter.second->Stop(SESSION_CANCEL_TIMEOUT); diff --git a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp index 5379cf795..9a8d34cd6 100644 --- a/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp +++ b/services/devicemanagerservice/src/dependency/softbus/softbus_connector.cpp @@ -106,7 +106,6 @@ int32_t SoftbusConnector::Init() dmPublishInfo.capability = DM_CAPABILITY_OSD; dmPublishInfo.capabilityData = nullptr; dmPublishInfo.dataLen = 0; - char discoverStatus[DISCOVER_STATUS_LEN + 1] = {0}; ret = GetParameter(DISCOVER_STATUS_KEY.c_str(), "not exist", discoverStatus, DISCOVER_STATUS_LEN); if (strcmp(discoverStatus, "not exist") == 0) { diff --git a/test_lite/device_manager_test.cpp b/test_lite/device_manager_test.cpp index abc537f33..0979cd76c 100644 --- a/test_lite/device_manager_test.cpp +++ b/test_lite/device_manager_test.cpp @@ -1,3 +1,18 @@ +/* + * Copyright (c) 2021 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 #include #include @@ -11,18 +26,14 @@ #include "device_manager_callback.h" #include "dm_constants.h" #include "dm_log.h" -// #include "ipc_server_stub.h" - -// #include "encrypt_utils.h" using namespace OHOS::DistributedHardware; namespace { DmDeviceInfo g_deviceInfo; std::vector g_deviceInfoList; -// const char *DM_CAPABILITY_OSD = "osdCapability"; std::string g_pinToken = ""; -static std::string packageName = "com.huawei.dosdemo1"; +static std::string packageName = "test.dosdemo1"; const int32_t BUF_SIZE = 45 * 1024; uint8_t g_buf[BUF_SIZE]; std::mutex lock_; @@ -32,7 +43,7 @@ int32_t g_selectedDeviceNo = 0; class DmTestInitCallback : public DmInitCallback { public: explicit DmTestInitCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestInitCallback(){} + virtual ~DmTestInitCallback() {} void OnRemoteDied() override; private: std::string bundleName_; @@ -46,7 +57,7 @@ void DmTestInitCallback::OnRemoteDied() class DmTestDeviceStateCallback : public DeviceStateCallback { public: explicit DmTestDeviceStateCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestDeviceStateCallback(){} + virtual ~DmTestDeviceStateCallback() {} void OnDeviceOnline(const DmDeviceInfo &deviceInfo) override; void OnDeviceReady(const DmDeviceInfo &deviceInfo) override; void OnDeviceOffline(const DmDeviceInfo &deviceInfo) override; @@ -82,7 +93,7 @@ void DmTestDeviceStateCallback::OnDeviceChanged(const DmDeviceInfo &deviceInfo) class DmTestDiscoverCallback : public DiscoveryCallback { public: explicit DmTestDiscoverCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestDiscoverCallback(){} + virtual ~DmTestDiscoverCallback() {} void OnDeviceFound(uint16_t subscribeld, const DmDeviceInfo &deviceInfo) override; void OnDiscoveryFailed(uint16_t subscribeld, int32_t failedReason) override; void OnDiscoverySuccess(uint16_t subscribeld) override; @@ -95,7 +106,7 @@ void DmTestDiscoverCallback::OnDeviceFound(uint16_t subscribeld, const DmDeviceI std::lock_guard autoLock(lock_); g_deviceInfoList.emplace_back(deviceInfo); g_deviceInfo = g_deviceInfoList[0]; - for (int i = 0; i < g_deviceInfoList.size(); ++i){ + for (int i = 0; i < g_deviceInfoList.size(); ++i) { LOGI("deviceNo:%d, deviceId:%s, deviceName:%s", i, g_deviceInfoList[i].deviceId, g_deviceInfoList[i].deviceName); } @@ -114,7 +125,7 @@ void DmTestDiscoverCallback::OnDiscoverySuccess(uint16_t subscribeId) class DmTestAuthenticateCallback : public AuthenticateCallback { public: explicit DmTestAuthenticateCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestAuthenticateCallback(){} + virtual ~DmTestAuthenticateCallback() {} void OnAuthResult(const std::string &deviceId, const std::string &pinToken, int32_t status, int32_t reason) override; @@ -123,7 +134,7 @@ private: }; void DmTestAuthenticateCallback::OnAuthResult(const std::string &deviceId, - const std::string &pinToken, int32_t status, int32_t reason) + const std::string &pinToken, int32_t status, int32_t reason) { LOGI("OnAuthResult, deviceId:%s, status:%d, pinToken:%s", deviceId.c_str(), status, pinToken.c_str()); g_pinToken = pinToken; @@ -132,7 +143,7 @@ void DmTestAuthenticateCallback::OnAuthResult(const std::string &deviceId, class DmTestVerifyAuthCallback : public VerifyAuthCallback { public: explicit DmTestVerifyAuthCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestVerifyAuthCallback(){}; + virtual ~DmTestVerifyAuthCallback() {}; void OnVerifyAuthResult(const std::string &deviceId, int32_t resultCode, int32_t flag) override; private: @@ -161,19 +172,16 @@ static void printUsage() LOGI("use the following cmds \n%s", g_usage.c_str()); } -std::shared_ptr initCallback; - void InitDeviceManager() { LOGI("devicemanagertest start. package name:%s", packageName.c_str()); + std::shared_ptr initCallback; initCallback = std::make_shared(packageName); if (DeviceManager::GetInstance().InitDeviceManager(packageName, initCallback) == DM_OK) { LOGI("InitDeviceManager success"); } } -std::shared_ptr discoverCallback; - void StartDeviceDiscovery() { DmSubscribeInfo dmSubscribeInfo = { @@ -188,6 +196,7 @@ void StartDeviceDiscovery() g_deviceInfoList.clear(); g_selectedDeviceNo = 0; std::string extra = "extra"; + std::shared_ptr discoverCallback; (void)strncpy_s(dmSubscribeInfo.capability, sizeof(dmSubscribeInfo.capability), DM_CAPABILITY_OSD, strlen(DM_CAPABILITY_OSD)); discoverCallback = std::make_shared(packageName); @@ -197,34 +206,23 @@ void StartDeviceDiscovery() } } -std::shared_ptr authenticateCallback; - void AuthenticateDevice() { - uint8_t * appIconTmp = (uint8_t*)malloc(10); - appIconTmp[9] = 'B'; - uint8_t * appThumbnailTmp = (uint8_t*)malloc(600); - appThumbnailTmp[599] = 'C'; - - DmAppImageInfo dmAppImageInfo(appIconTmp, 10, appThumbnailTmp, 600); std::string authExtra = "{\n" "\"authType\": 1,\n" - "\"targetPkgName\": \"com.huawei.dosdemo1\",\n" + "\"targetPkgName\": \"test.dosdemo1\",\n" "\"appName\": \"zhengjianming\",\n" "\"appDescription\": \"hehe\", \n" "\"business\": 0\n" "}"; + std::shared_ptr authenticateCallback; authenticateCallback = std::make_shared(packageName); if (DeviceManager::GetInstance().AuthenticateDevice( - packageName, 1, g_deviceInfo,authExtra, authenticateCallback) == DM_OK){ + packageName, 1, g_deviceInfo,authExtra, authenticateCallback) == DM_OK) { LOGI("AuthenticateDevice success"); } - free(appIconTmp); - free(appThumbnailTmp); } -std::shared_ptr verifyAuthCallback; - void CheckAuthentication(std::string& pinCode) { std::string authPara = "{\n" @@ -233,9 +231,10 @@ void CheckAuthentication(std::string& pinCode) "\"pinToken\": " + g_pinToken.c_str() + "}"; LOGI("authPara:\n%s", authPara.c_str()); + std::shared_ptr verifyAuthCallback; verifyAuthCallback = std::make_shared(packageName); if (DeviceManager::GetInstance().VerifyAuthentication( - packageName, authPara, verifyAuthCallback) == DM_OK){ + packageName, authPara, verifyAuthCallback) == DM_OK) { LOGI("CheckAuthentication success"); } } @@ -245,10 +244,10 @@ void GetTrustedDeviceList() std::vector dmDeviceInfoVec; std::string extra = "extra"; if (DeviceManager::GetInstance().GetTrustedDeviceList( - packageName, extra, dmDeviceInfoVec) == DM_OK){ + packageName, extra, dmDeviceInfoVec) == DM_OK) { LOGI("GetTrustedDeviceList success"); for (DmDeviceInfo dmDeviceInfo : dmDeviceInfoVec) { - LOGI("deviceID: %s,\ndeviceName: %s", + LOGI("deviceID: %s, deviceName: %s", dmDeviceInfo.deviceId, dmDeviceInfo.deviceName); } } @@ -257,20 +256,20 @@ void GetTrustedDeviceList() void StopDeviceDiscovery() { if (DeviceManager::GetInstance().StopDeviceDiscovery( - packageName, 0) == DM_OK){ + packageName, 0) == DM_OK) { LOGI("StopDeviceDiscovery success"); } } void UnInitDeviceManager() { - if (DeviceManager::GetInstance().UnInitDeviceManager(packageName) == DM_OK){ + if (DeviceManager::GetInstance().UnInitDeviceManager(packageName) == DM_OK) { LOGI("UnInitDeviceManager success"); } } -int main(){ +int main() { printUsage(); std::string cmd; while (std::cin >> cmd) { @@ -284,7 +283,7 @@ int main(){ g_selectedDeviceNo = selectNo < g_deviceInfoList.size() ? selectNo : 0; g_deviceInfo = g_deviceInfoList[g_selectedDeviceNo]; } else if (cmd == "AuthenticateDevice") { - AuthenticateDevice(); + AuthenticateDevice(); } else if (cmd == "CheckAuthentication") { std::string pinCode = ""; std::cin >> pinCode; -- Gitee From 5b6210499f0589a77d7ebff648026ef57a49f1fa Mon Sep 17 00:00:00 2001 From: zixing000 Date: Tue, 15 Mar 2022 15:28:28 +0800 Subject: [PATCH 14/19] codecheck Signed-off-by: zixing000 --- test_lite/device_manager_test.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/test_lite/device_manager_test.cpp b/test_lite/device_manager_test.cpp index 0979cd76c..5ff34de1a 100644 --- a/test_lite/device_manager_test.cpp +++ b/test_lite/device_manager_test.cpp @@ -172,17 +172,17 @@ static void printUsage() LOGI("use the following cmds \n%s", g_usage.c_str()); } -void InitDeviceManager() +static void InitDeviceManager() { LOGI("devicemanagertest start. package name:%s", packageName.c_str()); - std::shared_ptr initCallback; - initCallback = std::make_shared(packageName); + std::shared_ptr initCallback = + std::make_shared(packageName); if (DeviceManager::GetInstance().InitDeviceManager(packageName, initCallback) == DM_OK) { LOGI("InitDeviceManager success"); } } -void StartDeviceDiscovery() +static void StartDeviceDiscovery() { DmSubscribeInfo dmSubscribeInfo = { 0, @@ -206,7 +206,7 @@ void StartDeviceDiscovery() } } -void AuthenticateDevice() +static void AuthenticateDevice() { std::string authExtra = "{\n" "\"authType\": 1,\n" @@ -218,12 +218,12 @@ void AuthenticateDevice() std::shared_ptr authenticateCallback; authenticateCallback = std::make_shared(packageName); if (DeviceManager::GetInstance().AuthenticateDevice( - packageName, 1, g_deviceInfo,authExtra, authenticateCallback) == DM_OK) { + packageName, 1, g_deviceInfo, authExtra, authenticateCallback) == DM_OK) { LOGI("AuthenticateDevice success"); } } -void CheckAuthentication(std::string& pinCode) +static void CheckAuthentication(std::string& pinCode) { std::string authPara = "{\n" "\"authType\": 1,\n" @@ -239,7 +239,7 @@ void CheckAuthentication(std::string& pinCode) } } -void GetTrustedDeviceList() +static void GetTrustedDeviceList() { std::vector dmDeviceInfoVec; std::string extra = "extra"; @@ -247,13 +247,13 @@ void GetTrustedDeviceList() packageName, extra, dmDeviceInfoVec) == DM_OK) { LOGI("GetTrustedDeviceList success"); for (DmDeviceInfo dmDeviceInfo : dmDeviceInfoVec) { - LOGI("deviceID: %s, deviceName: %s", + LOGI("deviceID: %s, deviceName: %s", dmDeviceInfo.deviceId, dmDeviceInfo.deviceName); } } } -void StopDeviceDiscovery() +static void StopDeviceDiscovery() { if (DeviceManager::GetInstance().StopDeviceDiscovery( packageName, 0) == DM_OK) { @@ -261,7 +261,7 @@ void StopDeviceDiscovery() } } -void UnInitDeviceManager() +static void UnInitDeviceManager() { if (DeviceManager::GetInstance().UnInitDeviceManager(packageName) == DM_OK) { LOGI("UnInitDeviceManager success"); @@ -269,7 +269,8 @@ void UnInitDeviceManager() } -int main() { +int main() +{ printUsage(); std::string cmd; while (std::cin >> cmd) { -- Gitee From 7495b9c4960686e2eb91cfa4c9d697729f655488 Mon Sep 17 00:00:00 2001 From: zixing000 Date: Tue, 15 Mar 2022 15:55:52 +0800 Subject: [PATCH 15/19] codecheck Signed-off-by: zixing000 --- test_lite/device_manager_test.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test_lite/device_manager_test.cpp b/test_lite/device_manager_test.cpp index 5ff34de1a..6e17837ad 100644 --- a/test_lite/device_manager_test.cpp +++ b/test_lite/device_manager_test.cpp @@ -94,14 +94,14 @@ class DmTestDiscoverCallback : public DiscoveryCallback { public: explicit DmTestDiscoverCallback(std::string &bundleName):bundleName_(bundleName) {} virtual ~DmTestDiscoverCallback() {} - void OnDeviceFound(uint16_t subscribeld, const DmDeviceInfo &deviceInfo) override; - void OnDiscoveryFailed(uint16_t subscribeld, int32_t failedReason) override; - void OnDiscoverySuccess(uint16_t subscribeld) override; + void OnDeviceFound(uint16_t subscribeId, const DmDeviceInfo &deviceInfo) override; + void OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason) override; + void OnDiscoverySuccess(uint16_t subscribeId) override; private: std::string bundleName_; }; -void DmTestDiscoverCallback::OnDeviceFound(uint16_t subscribeld, const DmDeviceInfo &deviceInfo) +void DmTestDiscoverCallback::OnDeviceFound(uint16_t subscribeId, const DmDeviceInfo &deviceInfo) { std::lock_guard autoLock(lock_); g_deviceInfoList.emplace_back(deviceInfo); -- Gitee From 8a3bcffbd146b0335cd308b369c1f3c3b2642a9d Mon Sep 17 00:00:00 2001 From: zixing000 Date: Tue, 15 Mar 2022 16:03:39 +0800 Subject: [PATCH 16/19] codecheck Signed-off-by: zixing000 --- .../src/dependency/multipleuser/multiple_user_connector.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp b/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp index 18835da75..5214b4aa6 100644 --- a/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp +++ b/services/devicemanagerservice/src/dependency/multipleuser/multiple_user_connector.cpp @@ -36,7 +36,7 @@ int32_t MultipleUserConnector::GetCurrentAccountUserID(void) } return ids[0]; #else - return 0; + return 0; #endif } @@ -50,7 +50,7 @@ int32_t MultipleUserConnector::GetSwitchOldUserId(void) #ifndef LITE_DEVICE return oldUserId_; #else - return 0; + return 0; #endif } } // namespace DistributedHardware -- Gitee From 3ba428de645c8b53122da73f23c3567ef8c6041c Mon Sep 17 00:00:00 2001 From: zixing000 Date: Tue, 15 Mar 2022 17:08:34 +0800 Subject: [PATCH 17/19] delete test_lite Signed-off-by: zixing000 --- test_lite/BUILD.gn | 52 ----- test_lite/device_manager_test.cpp | 311 ------------------------------ 2 files changed, 363 deletions(-) delete mode 100644 test_lite/BUILD.gn delete mode 100644 test_lite/device_manager_test.cpp diff --git a/test_lite/BUILD.gn b/test_lite/BUILD.gn deleted file mode 100644 index 56907720e..000000000 --- a/test_lite/BUILD.gn +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (C) 2021 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. - -if (defined(ohos_lite)) { - import("//build/lite/config/component/lite_component.gni") -} else { - import("//build/ohos.gni") -} - -import("//foundation/distributedhardware/devicemanager/devicemanager.gni") - -if (defined(ohos_lite)) { - executable("devicemanagertest") { - include_dirs = [ - "${common_path}/include", - "${common_path}/include/ipc", - "${common_path}/include/ipc/model", - "${utils_path}/include", - "${utils_path}/include/ipc/lite", - "${innerkits_path}/native_cpp/include", - "${innerkits_path}/native_cpp/include/ipc", - "${innerkits_path}/native_cpp/include/ipc/lite", - "//utils/native/lite/include", - "//foundation/communication/ipc_lite/interfaces/kits", - "//foundation/distributedschedule/samgr_lite/interfaces/kits/samgr", - "//foundation/distributedschedule/samgr_lite/interfaces/kits/registry", - ] - sources = [ "device_manager_test.cpp" ] - defines = [ - "LITE_DEVICE", - "HI_LOG_ENABLE", - "DH_LOG_TAG=\"devicemanagerservice\"", - "LOG_DOMAIN=0xD004100", - ] - deps = [ - "${innerkits_path}/native_cpp:devicemanagersdk", - "${utils_path}:devicemanagerutils", - "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", - "//utils/native/lite:utils", - ] - } -} diff --git a/test_lite/device_manager_test.cpp b/test_lite/device_manager_test.cpp deleted file mode 100644 index 6e17837ad..000000000 --- a/test_lite/device_manager_test.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright (c) 2021 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 -#include -#include -#include -#include -#include - -#include "securec.h" - -#include "device_manager_impl.h" -#include "device_manager_callback.h" -#include "dm_constants.h" -#include "dm_log.h" - -using namespace OHOS::DistributedHardware; - -namespace { -DmDeviceInfo g_deviceInfo; -std::vector g_deviceInfoList; -std::string g_pinToken = ""; -static std::string packageName = "test.dosdemo1"; -const int32_t BUF_SIZE = 45 * 1024; -uint8_t g_buf[BUF_SIZE]; -std::mutex lock_; -int32_t g_selectedDeviceNo = 0; -} - -class DmTestInitCallback : public DmInitCallback { -public: - explicit DmTestInitCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestInitCallback() {} - void OnRemoteDied() override; -private: - std::string bundleName_; -}; - -void DmTestInitCallback::OnRemoteDied() -{ - LOGI("OnRemoteDied"); -} - -class DmTestDeviceStateCallback : public DeviceStateCallback { -public: - explicit DmTestDeviceStateCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestDeviceStateCallback() {} - void OnDeviceOnline(const DmDeviceInfo &deviceInfo) override; - void OnDeviceReady(const DmDeviceInfo &deviceInfo) override; - void OnDeviceOffline(const DmDeviceInfo &deviceInfo) override; - void OnDeviceChanged(const DmDeviceInfo &deviceInfo) override; -private: - std::string bundleName_; -}; - -void DmTestDeviceStateCallback::OnDeviceOnline(const DmDeviceInfo &deviceInfo) -{ - LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); - g_deviceInfo = deviceInfo; -} - -void DmTestDeviceStateCallback::OnDeviceReady(const DmDeviceInfo &deviceInfo) -{ - LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); - g_deviceInfo = deviceInfo; -} - -void DmTestDeviceStateCallback::OnDeviceOffline(const DmDeviceInfo &deviceInfo) -{ - LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); - g_deviceInfo = deviceInfo; -} - -void DmTestDeviceStateCallback::OnDeviceChanged(const DmDeviceInfo &deviceInfo) -{ - LOGI("deviceId:%s, deviceName:%s", deviceInfo.deviceId, deviceInfo.deviceName); - g_deviceInfo = deviceInfo; -} - -class DmTestDiscoverCallback : public DiscoveryCallback { -public: - explicit DmTestDiscoverCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestDiscoverCallback() {} - void OnDeviceFound(uint16_t subscribeId, const DmDeviceInfo &deviceInfo) override; - void OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason) override; - void OnDiscoverySuccess(uint16_t subscribeId) override; -private: - std::string bundleName_; -}; - -void DmTestDiscoverCallback::OnDeviceFound(uint16_t subscribeId, const DmDeviceInfo &deviceInfo) -{ - std::lock_guard autoLock(lock_); - g_deviceInfoList.emplace_back(deviceInfo); - g_deviceInfo = g_deviceInfoList[0]; - for (int i = 0; i < g_deviceInfoList.size(); ++i) { - LOGI("deviceNo:%d, deviceId:%s, deviceName:%s", - i, g_deviceInfoList[i].deviceId, g_deviceInfoList[i].deviceName); - } -} - -void DmTestDiscoverCallback::OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason) -{ - LOGI("OnDiscoverFailed, subscribeId:%u, failedReason:%d", subscribeId, failedReason); -} - -void DmTestDiscoverCallback::OnDiscoverySuccess(uint16_t subscribeId) -{ - LOGI("OnDiscoverSuccess, subscribeId:%u", subscribeId); -} - -class DmTestAuthenticateCallback : public AuthenticateCallback { -public: - explicit DmTestAuthenticateCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestAuthenticateCallback() {} - void OnAuthResult(const std::string &deviceId, const std::string &pinToken, - int32_t status, int32_t reason) override; - -private: - std::string bundleName_; -}; - -void DmTestAuthenticateCallback::OnAuthResult(const std::string &deviceId, - const std::string &pinToken, int32_t status, int32_t reason) -{ - LOGI("OnAuthResult, deviceId:%s, status:%d, pinToken:%s", deviceId.c_str(), status, pinToken.c_str()); - g_pinToken = pinToken; -} - -class DmTestVerifyAuthCallback : public VerifyAuthCallback { -public: - explicit DmTestVerifyAuthCallback(std::string &bundleName):bundleName_(bundleName) {} - virtual ~DmTestVerifyAuthCallback() {}; - void OnVerifyAuthResult(const std::string &deviceId, - int32_t resultCode, int32_t flag) override; -private: - std::string bundleName_; -}; - -void DmTestVerifyAuthCallback::OnVerifyAuthResult(const std::string &deviceId, int32_t resultCode, int32_t flag) -{ - LOGI("check deviceId:%s, resultCode:%d, flag:%d", deviceId.c_str(), resultCode, flag); -} - -static std::string g_usage = "InitDeviceManager\n" - "StartDeviceDiscovery\n" - "SelectDeviceNo\n" - "AuthenticateDevice\n" - "CheckAuthentication\n" - "GetTrustedDeviceList\n" - "StopDeviceDiscovery\n" - "UnInitDeviceManager\n" - "Exit\n" - "InputPlainText\n" - "DecryptTexit\n"; - -static void printUsage() -{ - LOGI("use the following cmds \n%s", g_usage.c_str()); -} - -static void InitDeviceManager() -{ - LOGI("devicemanagertest start. package name:%s", packageName.c_str()); - std::shared_ptr initCallback = - std::make_shared(packageName); - if (DeviceManager::GetInstance().InitDeviceManager(packageName, initCallback) == DM_OK) { - LOGI("InitDeviceManager success"); - } -} - -static void StartDeviceDiscovery() -{ - DmSubscribeInfo dmSubscribeInfo = { - 0, - DM_DISCOVER_MODE_ACTIVE, - DM_AUTO, - DM_HIGH, - false, - true, - "", - }; - g_deviceInfoList.clear(); - g_selectedDeviceNo = 0; - std::string extra = "extra"; - std::shared_ptr discoverCallback; - (void)strncpy_s(dmSubscribeInfo.capability, sizeof(dmSubscribeInfo.capability), - DM_CAPABILITY_OSD, strlen(DM_CAPABILITY_OSD)); - discoverCallback = std::make_shared(packageName); - if (DeviceManager::GetInstance().StartDeviceDiscovery( - packageName, dmSubscribeInfo, extra, discoverCallback) == DM_OK) { - LOGI("startDeviceDiscover success"); - } -} - -static void AuthenticateDevice() -{ - std::string authExtra = "{\n" - "\"authType\": 1,\n" - "\"targetPkgName\": \"test.dosdemo1\",\n" - "\"appName\": \"zhengjianming\",\n" - "\"appDescription\": \"hehe\", \n" - "\"business\": 0\n" - "}"; - std::shared_ptr authenticateCallback; - authenticateCallback = std::make_shared(packageName); - if (DeviceManager::GetInstance().AuthenticateDevice( - packageName, 1, g_deviceInfo, authExtra, authenticateCallback) == DM_OK) { - LOGI("AuthenticateDevice success"); - } -} - -static void CheckAuthentication(std::string& pinCode) -{ - std::string authPara = "{\n" - "\"authType\": 1,\n" - "\"pinCode\": " + pinCode + ",\n" - "\"pinToken\": " + g_pinToken.c_str() + - "}"; - LOGI("authPara:\n%s", authPara.c_str()); - std::shared_ptr verifyAuthCallback; - verifyAuthCallback = std::make_shared(packageName); - if (DeviceManager::GetInstance().VerifyAuthentication( - packageName, authPara, verifyAuthCallback) == DM_OK) { - LOGI("CheckAuthentication success"); - } -} - -static void GetTrustedDeviceList() -{ - std::vector dmDeviceInfoVec; - std::string extra = "extra"; - if (DeviceManager::GetInstance().GetTrustedDeviceList( - packageName, extra, dmDeviceInfoVec) == DM_OK) { - LOGI("GetTrustedDeviceList success"); - for (DmDeviceInfo dmDeviceInfo : dmDeviceInfoVec) { - LOGI("deviceID: %s, deviceName: %s", - dmDeviceInfo.deviceId, dmDeviceInfo.deviceName); - } - } -} - -static void StopDeviceDiscovery() -{ - if (DeviceManager::GetInstance().StopDeviceDiscovery( - packageName, 0) == DM_OK) { - LOGI("StopDeviceDiscovery success"); - } -} - -static void UnInitDeviceManager() -{ - if (DeviceManager::GetInstance().UnInitDeviceManager(packageName) == DM_OK) { - LOGI("UnInitDeviceManager success"); - } -} - - -int main() -{ - printUsage(); - std::string cmd; - while (std::cin >> cmd) { - if (cmd == "InitDeviceManager") { - InitDeviceManager(); - } else if (cmd == "StartDeviceDiscovery") { - StartDeviceDiscovery(); - } else if (cmd == "SelectDeviceNo") { - int32_t selectNo; - std::cin >> selectNo; - g_selectedDeviceNo = selectNo < g_deviceInfoList.size() ? selectNo : 0; - g_deviceInfo = g_deviceInfoList[g_selectedDeviceNo]; - } else if (cmd == "AuthenticateDevice") { - AuthenticateDevice(); - } else if (cmd == "CheckAuthentication") { - std::string pinCode = ""; - std::cin >> pinCode; - CheckAuthentication(pinCode); - } else if (cmd == "GetTrustedDeviceList") { - GetTrustedDeviceList(); - } else if (cmd == "StopDeviceDiscovery") { - StopDeviceDiscovery(); - } else if (cmd == "UnInitDeviceManager") { - UnInitDeviceManager(); - } else if (cmd == "InputEncryptText") { - LOGI("EncryptText:InputEncryptText unsupport."); - } else if (cmd == "DecryptTexit") { - LOGI("EncryptText:DecryptTexit unsupport."); - } else if (cmd == "Exit") { - break; - } else { - LOGI("unknown cmd\n"); - } - LOGI("%s end\n", cmd.c_str()); - printUsage(); - } - return 0; -} -- Gitee From 143ec8fa02bb656305030910c78be115dcae32e7 Mon Sep 17 00:00:00 2001 From: zixing000 Date: Wed, 16 Mar 2022 14:42:44 +0800 Subject: [PATCH 18/19] =?UTF-8?q?BUILD.gn=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zixing000 --- BUILD.gn | 1 - services/devicemanagerservice/BUILD.gn | 13 ++++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 5b25f37c8..103ee5a70 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -18,7 +18,6 @@ if (defined(ohos_lite)) { "utils:devicemanagerutils", "services/devicemanagerservice:devicemanagerservice", "interfaces/inner_kits/native_cpp:devicemanagersdk", - "test_lite:devicemanagertest", ] } } diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index b869f6bdb..c4a3c6429 100755 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -100,7 +100,7 @@ if (defined(ohos_lite)) { ] deps = [ - "${common_path}/include/dialog_ui/js:dialog_js_files_etc", + "${common_path}/include/show_confirm_dialog/dialog_ui/js:dialog_js_files_etc", "${innerkits_path}/native_cpp:devicemanagersdk", "${utils_path}:devicemanagerutils", "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", @@ -184,6 +184,7 @@ if (defined(ohos_lite)) { ] deps = [ + "${common_path}/include/dialog_ui/js:dialog_js_files_etc", "${innerkits_path}/native_cpp:devicemanagersdk", "${utils_path}:devicemanagerutils", "//base/account/os_account/frameworks/osaccount/native:os_account_innerkits", @@ -191,16 +192,10 @@ if (defined(ohos_lite)) { "//foundation/aafwk/standard/interfaces/innerkits/ability_manager:ability_manager", "//foundation/aafwk/standard/interfaces/innerkits/want:want", "//foundation/aafwk/standard/services/abilitymgr:abilityms", + "//foundation/ace/ace_engine/interfaces/innerkits/ui_service_manager:ui_service_mgr", + "//foundation/windowmanager/wm:libwm", ] - if (!device_manager_base_no_interaction_auth) { - deps += [ - "${common_path}/include/show_confirm_dialog/dialog_ui/js:dialog_js_files_etc", - "//foundation/ace/ace_engine/interfaces/innerkits/ui_service_manager:ui_service_mgr", - "//foundation/windowmanager/wm:libwm", - ] - defines += [ "SUPPORT_GRAPHICS" ] - } external_deps = [ "ability_runtime:app_manager", "bundle_framework:appexecfwk_base", -- Gitee From abd945d2098446fad11ddb57b18cb9e5f6e3e44d Mon Sep 17 00:00:00 2001 From: zixing000 Date: Wed, 16 Mar 2022 15:11:39 +0800 Subject: [PATCH 19/19] BUILD.gn Signed-off-by: zixing000 --- services/devicemanagerservice/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/devicemanagerservice/BUILD.gn b/services/devicemanagerservice/BUILD.gn index c4a3c6429..56fc6ae39 100755 --- a/services/devicemanagerservice/BUILD.gn +++ b/services/devicemanagerservice/BUILD.gn @@ -184,7 +184,7 @@ if (defined(ohos_lite)) { ] deps = [ - "${common_path}/include/dialog_ui/js:dialog_js_files_etc", + "${common_path}/include/show_confirm_dialog/dialog_ui/js:dialog_js_files_etc", "${innerkits_path}/native_cpp:devicemanagersdk", "${utils_path}:devicemanagerutils", "//base/account/os_account/frameworks/osaccount/native:os_account_innerkits", -- Gitee