From d1a1d5819d688302b1633ecf2304da5d097d8f2b Mon Sep 17 00:00:00 2001 From: sunxiaoqianghappy <“sunxiaoqiang7@huawei.com”> Date: Thu, 17 Jul 2025 20:59:02 +0800 Subject: [PATCH] =?UTF-8?q?MTP=20DFX=E8=83=BD=E5=8A=9B=E5=A2=9E=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sunxiaoqianghappy Signed-off-by: sunxiaoqianghappy <“sunxiaoqiang7@huawei.com”> --- .../include/utils/storage_radar.h | 5 ++ .../mtp/src/mtp_device_monitor.cpp | 20 ++++++++ .../mtpfs/include/mtpfs_mtp_device.h | 2 +- .../storage_daemon/mtpfs/src/mtpfs_fuse.cpp | 18 +++++++ .../storage_daemon/utils/storage_radar.cpp | 50 +++++++++++++++++++ 5 files changed, 94 insertions(+), 1 deletion(-) diff --git a/services/storage_daemon/include/utils/storage_radar.h b/services/storage_daemon/include/utils/storage_radar.h index b5b9bb488..ce0f87468 100644 --- a/services/storage_daemon/include/utils/storage_radar.h +++ b/services/storage_daemon/include/utils/storage_radar.h @@ -131,6 +131,11 @@ public: static void ReportIamResult(const std::string &funcName, uint32_t userId, int ret); static void ReportHuksResult(const std::string &funcName, int ret); static void ReportMtpfsResult(const std::string &funcName, int ret); + static void ReportMtpMountResult(const std::string &funcName, int ret); + static void ReportPtpModeResult(const std::string &funcName, const std::string &isOpenHarmony, + const std::string &vendor, const std::string &product); + static void ReportMtpModeResult(const std::string &funcName, const std::string &isOpenHarmony, + const std::string &vendor, const std::string &product); static void ReportStorageUsage(enum BizStage stage, const std::string &extraData); static void ReportKeyRingResult(const std::string &funcName, int ret, const std::string &extraData); static void ReportOsAccountResult(const std::string &funcName, int32_t ret, unsigned int userId); diff --git a/services/storage_daemon/mtp/src/mtp_device_monitor.cpp b/services/storage_daemon/mtp/src/mtp_device_monitor.cpp index 0305a9b87..108d1a10c 100644 --- a/services/storage_daemon/mtp/src/mtp_device_monitor.cpp +++ b/services/storage_daemon/mtp/src/mtp_device_monitor.cpp @@ -30,6 +30,7 @@ #include "mtp/usb_event_subscriber.h" #include "storage_service_errno.h" #include "storage_service_log.h" +#include "storage_radar.h" #include "utils/file_utils.h" #include "usb_srv_client.h" @@ -40,6 +41,7 @@ constexpr int32_t SLEEP_TIME = 1; constexpr int32_t MTP_VAL_LEN = 6; constexpr int32_t MTP_TRUE_LEN = 5; constexpr int32_t DETECT_CNT = 4; +constexpr int32_t BUF_SIZE_8 = 8; constexpr int UPLOAD_RECORD_FALSE_LEN = 5; constexpr int UPLOAD_RECORD_TRUE_LEN = 4; @@ -49,6 +51,7 @@ constexpr const char *SYS_PARAM_SERVICE_ENTERPRISE_ENABLE = "const.edm.is_enterp constexpr const char *KEY_CUST = "const.cust.custPath"; constexpr const char *CUST_HWIT = "hwit"; constexpr const char *IS_PYP_MODE = "user.isptpmode"; +constexpr const char *IS_OPEN_HARMONY = "user.isOpenHarmonyMtpDevice"; constexpr int32_t SYS_PARARMETER_SIZE = 256; bool g_keepMonitoring = true; @@ -138,8 +141,13 @@ void MtpDeviceMonitor::MountMtpDeviceByBroadcast() ret = MountMtpDevice(devInfos); if (ret != E_OK) { LOGE("mount mtp device failed"); + StorageService::StorageRadar::ReportMtpMountResult("MountMtpDevice", ret); return; } + + char buf[BUF_SIZE_8] = {0}; + std::string extraData; + std::string vendor; bool isPtp = UsbEventSubscriber::IsPtpMode(); for (const auto& devInfo : devInfos) { @@ -148,6 +156,18 @@ void MtpDeviceMonitor::MountMtpDeviceByBroadcast() if (setxattr(devInfo.path.c_str(), IS_PYP_MODE, value, len, 0) == -1) { LOGE("Failed to set xattr"); } + if (getxattr(devInfo.path.c_str(), IS_OPEN_HARMONY, buf, sizeof(buf) - 1) == -1) { + LOGE("Failed to get xattr"); + } + extraData = devInfo.product; + vendor = devInfo.vendor; + } + if (isPtp) { + StorageService::StorageRadar::ReportPtpModeResult("MountPtpDevice", + std::string(buf), vendor, extraData); + } else { + StorageService::StorageRadar::ReportMtpModeResult("MountMtpDevice", + std::string(buf), vendor, extraData); } } diff --git a/services/storage_daemon/mtpfs/include/mtpfs_mtp_device.h b/services/storage_daemon/mtpfs/include/mtpfs_mtp_device.h index 9eae3c5ec..4f5e383e7 100644 --- a/services/storage_daemon/mtpfs/include/mtpfs_mtp_device.h +++ b/services/storage_daemon/mtpfs/include/mtpfs_mtp_device.h @@ -107,10 +107,10 @@ public: static int EraseRemovingFile(const std::string &path); static bool IsFileRemoving(const std::string &path); void SetPtpMode(const char *mode); + bool IsOpenHarmonyMtpDevice(); private: bool EnumStorages(); - bool IsOpenHarmonyMtpDevice(); static Capabilities GetCapabilities(const MtpFsDevice &device); bool ConvertErrorCode(LIBMTP_error_number_t err); const void HandleDir(LIBMTP_file_t *content, MtpFsTypeDir *dir); diff --git a/services/storage_daemon/mtpfs/src/mtpfs_fuse.cpp b/services/storage_daemon/mtpfs/src/mtpfs_fuse.cpp index d14c26398..ac0263428 100644 --- a/services/storage_daemon/mtpfs/src/mtpfs_fuse.cpp +++ b/services/storage_daemon/mtpfs/src/mtpfs_fuse.cpp @@ -1355,6 +1355,22 @@ static int QueryMtpIsInUse(MtpFsDevice &device, char *out, size_t size) return isEmpty ? UPLOAD_RECORD_FALSE_LEN : UPLOAD_RECORD_TRUE_LEN; } +static int IsOpenHarmonyMtpDevice(MtpFsDevice &device, char *out, size_t size) +{ + bool isOpenHarmony = device.IsOpenHarmonyMtpDevice(); + int ret; + if (isOpenHarmony) { + ret = memcpy_s(out, size, "true", UPLOAD_RECORD_TRUE_LEN); + } else { + ret = memcpy_s(out, size, "false", UPLOAD_RECORD_FALSE_LEN); + } + if (ret != 0) { + LOGE("copy fail, ret=%{public}d", ret); + return 0; + } + return isOpenHarmony ? UPLOAD_RECORD_TRUE_LEN : UPLOAD_RECORD_FALSE_LEN; +} + int MtpFileSystem::GetXAttr(const char *path, const char *in, char *out, size_t size) { if (path == nullptr || in == nullptr) { @@ -1373,6 +1389,8 @@ int MtpFileSystem::GetXAttr(const char *path, const char *in, char *out, size_t return GetFriendlyName(in, out, size); } else if (strcmp(in, "user.queryMtpIsInUse") == 0) { return QueryMtpIsInUse(device_, out, size); + } else if (strcmp(in, "user.isOpenHarmonyMtpDevice") == 0) { + return IsOpenHarmonyMtpDevice(device_, out, size); } LOGE("attrKey error, attrKey=%{public}s", in); return 0; diff --git a/services/storage_daemon/utils/storage_radar.cpp b/services/storage_daemon/utils/storage_radar.cpp index 1283d8bd4..30c5fb72d 100644 --- a/services/storage_daemon/utils/storage_radar.cpp +++ b/services/storage_daemon/utils/storage_radar.cpp @@ -29,6 +29,8 @@ constexpr char STORAGESERVICE_DOAMIN[] = "FILEMANAGEMENT"; constexpr uint8_t INDEX = 3; constexpr uint32_t MS_1000 = 1000; constexpr int32_t GLOBAL_USER_ID = 0; +constexpr int32_t PTP_MODE = 20000; +constexpr int32_t MTP_MODE = 30000; constexpr const char *TAG_PREFIX = " WARNING: DELAY > "; constexpr const char *TAG_UNIT_SUFFIX = " ms."; @@ -201,6 +203,54 @@ void StorageRadar::ReportMtpfsResult(const std::string &funcName, int ret) StorageRadar::GetInstance().RecordFuctionResult(param); } +void StorageRadar::ReportMtpMountResult(const std::string &funcName, int ret) +{ + RadarParameter param = { + .orgPkg = DEFAULT_ORGPKGNAME, + .userId = DEFAULT_USERID, + .funcName = funcName, + .bizScene = BizScene::STORAGE_MTPFS, + .bizStage = BizStage::BIZ_STAGE_MTPFS_MTP_DEVICE, + .keyElxLevel = "NA", + .errorCode = ret, + }; + StorageRadar::GetInstance().RecordFuctionResult(param); +} + +void StorageRadar::ReportPtpModeResult(const std::string &funcName, const std::string &isOpenHarmony, + const std::string &vendor, const std::string &product) +{ + RadarParameter param = { + .orgPkg = DEFAULT_ORGPKGNAME, + .userId = PTP_MODE, + .funcName = funcName, + .bizScene = BizScene::STORAGE_MTPFS, + .bizStage = BizStage::BIZ_STAGE_MTPFS_MTP_DEVICE, + .keyElxLevel = isOpenHarmony, + .errorCode = E_ERR, + .extraData = product, + .toCallPkg = vendor + }; + StorageRadar::GetInstance().RecordFuctionResult(param); +} + +void StorageRadar::ReportMtpModeResult(const std::string &funcName, const std::string &isOpenHarmony, + const std::string &vendor, const std::string &product) +{ + RadarParameter param = { + .orgPkg = DEFAULT_ORGPKGNAME, + .userId = MTP_MODE, + .funcName = funcName, + .bizScene = BizScene::STORAGE_MTPFS, + .bizStage = BizStage::BIZ_STAGE_MTPFS_MTP_DEVICE, + .keyElxLevel = isOpenHarmony, + .errorCode = E_ERR, + .extraData = product, + .toCallPkg = vendor + }; + StorageRadar::GetInstance().RecordFuctionResult(param); +} + void StorageRadar::ReportKeyRingResult(const std::string &funcName, int ret, const std::string &extraData) { RadarParameter param = { -- Gitee