diff --git a/framework/common/udmf_types_util.cpp b/framework/common/udmf_types_util.cpp index 47b9aa896daeed6756de6fd35dca1e73259dd73a..b4dda78dd94496776c76276fd262f797ae68f17c 100644 --- a/framework/common/udmf_types_util.cpp +++ b/framework/common/udmf_types_util.cpp @@ -59,7 +59,6 @@ bool Unmarshalling(UnifiedData &output, MessageParcel &parcel) LOG_ERROR(UDMF_SERVICE, "Unmarshall unified data failed!"); return false; } - UdmfConversion::ConvertRecordToSubclass(output); return true; } @@ -99,7 +98,6 @@ bool Unmarshalling(std::vector &output, MessageParcel &parcel) LOG_ERROR(UDMF_SERVICE, "Unmarshall unified data set failed!"); return false; } - UdmfConversion::ConvertRecordToSubclass(output); return true; } diff --git a/framework/common/unittest/BUILD.gn b/framework/common/unittest/BUILD.gn index 4afce7f08a5738b69be51b4e2be9bdfcfb1c4b47..eeb8d467fda91d3ef4e959f3638884d741ac336c 100644 --- a/framework/common/unittest/BUILD.gn +++ b/framework/common/unittest/BUILD.gn @@ -129,7 +129,10 @@ ohos_unittest("UdmfTypesUtilAbnormalTest") { ohos_unittest("TlvUtilTest") { module_out_path = module_output_path - sources = [ "tlv_util_test.cpp" ] + sources = [ + "${udmf_framework_path}/innerkitsimpl/convert/udmf_conversion.cpp", + "tlv_util_test.cpp", + ] configs = [ ":module_private_config" ] diff --git a/framework/innerkitsimpl/common/unified_meta.cpp b/framework/innerkitsimpl/common/unified_meta.cpp index 8aa8769056565fe7e7c625c29b9a46ad42abbe87..3b58f5c7265fb7b6318855120b769c6705c6c659 100644 --- a/framework/innerkitsimpl/common/unified_meta.cpp +++ b/framework/innerkitsimpl/common/unified_meta.cpp @@ -674,6 +674,9 @@ std::shared_ptr ObjectUtils::ConvertToObject(UDDetails &details) UDDetails ObjectUtils::ConvertToUDDetails(std::shared_ptr object) { UDDetails details; + if (object == nullptr) { + return details; + } for (auto [key, value] : object->value_) { if (!ConvertVariant(std::move(value), details[key])) { LOG_ERROR(UnifiedRecord, "object convert to UDDetails failed, object key is %{public}s", key.c_str()); @@ -681,5 +684,79 @@ UDDetails ObjectUtils::ConvertToUDDetails(std::shared_ptr object) } return details; } + +int64_t ObjectUtils::GetValueSize(ValueType value, bool isCalValueType) +{ + if (value.index() ==0) { + return 0; + } + if (std::holds_alternative(value)) { + return std::get(value).size(); + } + if (std::holds_alternative>(value)) { + return GetObjectValueSize(std::get>(value), isCalValueType); + } + if (std::holds_alternative>(value)) { + return std::get>(value).size(); + } + if (std::holds_alternative>(value)) { + auto pixelMap = std::get>(value); + return pixelMap->GetByteCount(); + } + if (std::holds_alternative>(value)) { + auto want = std::get>(value); + Parcel parcel; + if (!want->Marshalling(parcel)) { + LOG_ERROR(UDMF_FRAMEWORK, "Marshalling want error when GetValueSize!"); + return 0; + } + return parcel.GetDataSize(); + } + return std::visit([] (const auto &val) { + return sizeof(val); + }, value); +} + +int64_t ObjectUtils::GetObjectValueSize(std::shared_ptr object, bool isCalValueType) +{ + if (object == nullptr) { + return 0; + } + int64_t size = 0; + std::set isNotNeedToCount = + {UNIFORM_DATA_TYPE, ARRAY_BUFFER_LENGTH, THUMB_DATA_LENGTH, APP_ICON_LENGTH}; + for (auto [key, value] : object->value_) { + if (isNotNeedToCount.find(key) != isNotNeedToCount.end()) { + continue; + } + if (key == VALUE_TYPE && isCalValueType) { + size += GetValueSize(value, false); + continue; + } + if (key == DETAILS) { + if (!std::holds_alternative>(value)) { + LOG_ERROR(UDMF_FRAMEWORK, "Details is not correct!"); + continue; + } + size += GetAllObjectSize(std::get>(value)); + continue; + } + size += GetValueSize(value, false); + } + return size; +} + + +int64_t ObjectUtils::GetAllObjectSize(std::shared_ptr object) +{ + if (object == nullptr) { + return 0; + } + int64_t size = 0; + for (auto [key, value] : object->value_) { + size += key.size() + GetValueSize(value, false); + } + return size; +} } // namespace UDMF } // namespace OHOS \ No newline at end of file diff --git a/framework/innerkitsimpl/data/application_defined_record.cpp b/framework/innerkitsimpl/data/application_defined_record.cpp index 350a3446980c2f29ecd108ccee8882f208a93ef4..7aa9bae931b775d2429cf16929a265fb30e2768a 100644 --- a/framework/innerkitsimpl/data/application_defined_record.cpp +++ b/framework/innerkitsimpl/data/application_defined_record.cpp @@ -55,7 +55,7 @@ ApplicationDefinedRecord::ApplicationDefinedRecord(UDType type, ValueType value) int64_t ApplicationDefinedRecord::GetSize() { - return rawData_.size() + applicationDefinedType.size(); + return rawData_.size(); } std::string ApplicationDefinedRecord::GetApplicationDefinedType() const @@ -97,7 +97,7 @@ void ApplicationDefinedRecord::InitObject() object->value_[UNIFORM_DATA_TYPE] = applicationDefinedType; object->value_[ARRAY_BUFFER] = rawData_; object->value_[ARRAY_BUFFER_LENGTH] = static_cast(rawData_.size()); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } diff --git a/framework/innerkitsimpl/data/audio.cpp b/framework/innerkitsimpl/data/audio.cpp index 15682d94777a25e5bc20f7da77afabc3532cc21d..a30e5e222184e172a9accc02d2895b0442afc1d4 100644 --- a/framework/innerkitsimpl/data/audio.cpp +++ b/framework/innerkitsimpl/data/audio.cpp @@ -19,16 +19,17 @@ namespace OHOS { namespace UDMF { Audio::Audio() : Audio("") { + SetType(AUDIO); } Audio::Audio(const std::string &uri) : File(uri) { - this->dataType_ = AUDIO; + SetType(AUDIO); } Audio::Audio(UDType type, ValueType value) : File(type, value) { - this->dataType_ = AUDIO; + SetType(AUDIO); } } // namespace UDMF } // namespace OHOS \ No newline at end of file diff --git a/framework/innerkitsimpl/data/file.cpp b/framework/innerkitsimpl/data/file.cpp index 43beaed6db3b4669b502d43ba5630cbf21279fa0..2817cc1c7b0aea5d0b3f23b05d449781b677729d 100644 --- a/framework/innerkitsimpl/data/file.cpp +++ b/framework/innerkitsimpl/data/file.cpp @@ -45,7 +45,7 @@ File::File(UDType type, ValueType value) : UnifiedRecord(type, value) int64_t File::GetSize() { - return this->oriUri_.size() + this->remoteUri_.size(); + return this->oriUri_.size() + this->remoteUri_.size() + UnifiedDataUtils::GetDetailsSize(this->details_); } std::string File::GetUri() const @@ -100,7 +100,7 @@ void File::InitObject() object->value_[ORI_URI] = oriUri_; object->value_[REMOTE_URI] = remoteUri_; object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } diff --git a/framework/innerkitsimpl/data/folder.cpp b/framework/innerkitsimpl/data/folder.cpp index 3bb45e93fcd697eea507c13fd5bfbd127fbdc002..e6b973f81fc657037b42b6de4b5980ad153d5572 100644 --- a/framework/innerkitsimpl/data/folder.cpp +++ b/framework/innerkitsimpl/data/folder.cpp @@ -19,16 +19,17 @@ namespace OHOS { namespace UDMF { Folder::Folder() : Folder("") { + SetType(FOLDER); } Folder::Folder(const std::string &uri) : File(uri) { - this->dataType_ = FOLDER; + SetType(FOLDER); } Folder::Folder(UDType type, ValueType value) : File(type, value) { - this->dataType_ = FOLDER; + SetType(FOLDER); } } // namespace UDMF } // namespace OHOS diff --git a/framework/innerkitsimpl/data/html.cpp b/framework/innerkitsimpl/data/html.cpp old mode 100755 new mode 100644 index 324d9acf5dd96edfad50fbd7096a28a9b052898e..5532ba4173013aa259342a2df93d0ad11b98dbf0 --- a/framework/innerkitsimpl/data/html.cpp +++ b/framework/innerkitsimpl/data/html.cpp @@ -104,7 +104,7 @@ void Html::InitObject() object->value_[HTML_CONTENT] = htmlContent_; object->value_[PLAIN_CONTENT] = plainContent_; object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } } // namespace UDMF diff --git a/framework/innerkitsimpl/data/image.cpp b/framework/innerkitsimpl/data/image.cpp index a2a891d3a0c4e12d26a49326a2e96ccf7aa6f9aa..90846a64b7f2ef71278a62f193d6a8897e4d8bf4 100644 --- a/framework/innerkitsimpl/data/image.cpp +++ b/framework/innerkitsimpl/data/image.cpp @@ -19,16 +19,17 @@ namespace OHOS { namespace UDMF { Image::Image() : Image("") { + SetType(IMAGE); } Image::Image(const std::string &uri) : File(uri) { - this->dataType_ = IMAGE; + SetType(IMAGE); } Image::Image(UDType type, ValueType value) : File(type, value) { - this->dataType_ = IMAGE; + SetType(IMAGE); } } // namespace UDMF } // namespace OHOS \ No newline at end of file diff --git a/framework/innerkitsimpl/data/link.cpp b/framework/innerkitsimpl/data/link.cpp old mode 100755 new mode 100644 index ebfe38ea633c8dd852e5fee31248c0c1422c63bd..4f57b431d57c1daf1f4f659fa8b444880a323519 --- a/framework/innerkitsimpl/data/link.cpp +++ b/framework/innerkitsimpl/data/link.cpp @@ -99,7 +99,7 @@ void Link::InitObject() object->value_[URL] = url_; object->value_[DESCRIPTION] = description_; object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } } // namespace UDMF diff --git a/framework/innerkitsimpl/data/plain_text.cpp b/framework/innerkitsimpl/data/plain_text.cpp old mode 100755 new mode 100644 index 9a28b4f9adffdaccf2b455804424171192ea200f..1e04c210434789fa782c7d63d9a65e038d8d66c8 --- a/framework/innerkitsimpl/data/plain_text.cpp +++ b/framework/innerkitsimpl/data/plain_text.cpp @@ -21,6 +21,7 @@ namespace OHOS { namespace UDMF { PlainText::PlainText() : PlainText("", "") { + SetType(PLAIN_TEXT); } PlainText::PlainText(const std::string &content, const std::string &abstract) @@ -102,7 +103,7 @@ void PlainText::InitObject() object->value_[CONTENT] = content_; object->value_[ABSTRACT] = abstract_; object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } } // namespace UDMF diff --git a/framework/innerkitsimpl/data/system_defined_appitem.cpp b/framework/innerkitsimpl/data/system_defined_appitem.cpp old mode 100755 new mode 100644 index 9cfc622c926782b3d02703afac4de8aa481d17cc..a0969dca02ebafe90d03b93baaefeb63b98022a2 --- a/framework/innerkitsimpl/data/system_defined_appitem.cpp +++ b/framework/innerkitsimpl/data/system_defined_appitem.cpp @@ -179,7 +179,7 @@ void SystemDefinedAppItem::InitObject() object->value_[BUNDLE_NAME] = bundleName_; object->value_[ABILITY_NAME] = abilityName_; object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } } // namespace UDMF diff --git a/framework/innerkitsimpl/data/system_defined_form.cpp b/framework/innerkitsimpl/data/system_defined_form.cpp index 1bfcbc34a6f19a1bebf68d42a92ae38b0ae871b1..376869d0b358596092cb14c6ce558081f92e8368 100644 --- a/framework/innerkitsimpl/data/system_defined_form.cpp +++ b/framework/innerkitsimpl/data/system_defined_form.cpp @@ -19,12 +19,12 @@ namespace OHOS { namespace UDMF { SystemDefinedForm::SystemDefinedForm() { - this->dataType_ = SYSTEM_DEFINED_FORM; + SetType(SYSTEM_DEFINED_FORM); } SystemDefinedForm::SystemDefinedForm(UDType type, ValueType value) : SystemDefinedRecord(type, value) { - this->dataType_ = SYSTEM_DEFINED_FORM; + SetType(SYSTEM_DEFINED_FORM); if (std::holds_alternative>(value)) { auto object = std::get>(value); object->GetValue(FORMID, formId_); @@ -165,7 +165,7 @@ void SystemDefinedForm::InitObject() object->value_[ABILITY_NAME] = abilityName_; object->value_[MODULE] = module_; object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } diff --git a/framework/innerkitsimpl/data/system_defined_pixelmap.cpp b/framework/innerkitsimpl/data/system_defined_pixelmap.cpp old mode 100755 new mode 100644 index 94d6b3992533e8e593ddfc9670ff7c337fa83347..1af49da1d83ac391643cdd14fe730dbcc3f71ddd --- a/framework/innerkitsimpl/data/system_defined_pixelmap.cpp +++ b/framework/innerkitsimpl/data/system_defined_pixelmap.cpp @@ -99,7 +99,7 @@ void SystemDefinedPixelMap::InitObject() } object->value_[UNIFORM_DATA_TYPE] = UtdUtils::GetUtdIdFromUtdEnum(dataType_); object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } } // namespace UDMF diff --git a/framework/innerkitsimpl/data/system_defined_record.cpp b/framework/innerkitsimpl/data/system_defined_record.cpp index e4dc3e26a84db6c2d61b968f819b1fb3ab38472e..9cd430c7f397586293e43e5111b5903ca1e71567 100644 --- a/framework/innerkitsimpl/data/system_defined_record.cpp +++ b/framework/innerkitsimpl/data/system_defined_record.cpp @@ -81,7 +81,7 @@ void SystemDefinedRecord::InitObject() value_ = std::make_shared(); auto object = std::get>(value_); object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } } // namespace UDMF diff --git a/framework/innerkitsimpl/data/text.cpp b/framework/innerkitsimpl/data/text.cpp index 9d473c8578e818ca1eff3254b0610884540d626f..990beec0389d205303c7f64a9bbfef297163c10b 100644 --- a/framework/innerkitsimpl/data/text.cpp +++ b/framework/innerkitsimpl/data/text.cpp @@ -64,7 +64,7 @@ void Text::InitObject() value_ = std::make_shared(); auto object = std::get>(value_); object->value_[DETAILS] = ObjectUtils::ConvertToObject(details_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } } // namespace UDMF diff --git a/framework/innerkitsimpl/data/unified_data_helper.cpp b/framework/innerkitsimpl/data/unified_data_helper.cpp index a7a13033d4b8a47785ee7ac99b1071308533ec28..1e9bb89188998dd0b0914bfbf1c480d3a78426a9 100644 --- a/framework/innerkitsimpl/data/unified_data_helper.cpp +++ b/framework/innerkitsimpl/data/unified_data_helper.cpp @@ -32,7 +32,6 @@ constexpr mode_t MODE = 0700; static constexpr int64_t MAX_KV_RECORD_SIZE = 2 * 1024 * 1024; static constexpr int64_t MAX_KV_DATA_SIZE = 4 * 1024 * 1024; static constexpr int64_t MAX_IPC_RAW_DATA_SIZE = 128 * 1024 * 1024; -static constexpr int64_t MAX_SA_DRAG_RECORD_SIZE = 3.5 * 1024 * 1024; constexpr const char *TEMP_UNIFIED_DATA_ROOT_PATH = "data/storage/el2/base/temp/udata"; constexpr const char *TEMP_UNIFIED_DATA_SUFFIX = ".ud"; @@ -118,6 +117,8 @@ void UnifiedDataHelper::GetSummary(const UnifiedData &data, Summary &summary) bool UnifiedDataHelper::Pack(UnifiedData &data) { + UdmfConversion::InitValueObject(data); + Summary summary; GetSummary(data, summary); @@ -233,13 +234,6 @@ int32_t UnifiedDataHelper::ProcessBigData(UnifiedData &data, Intention intention LOG_ERROR(UDMF_SERVICE, "Exceeded ipc-send data limit, totalSize:%{public}" PRId64 " !", size); return E_INVALID_PARAMETERS; } - for (const auto &record : data.GetRecords()) { - auto recordSize = record->GetSize(); - if (recordSize > MAX_SA_DRAG_RECORD_SIZE) { - LOG_ERROR(UDMF_SERVICE, "Exceeded drag single record limit, totalSize:%{public}" PRId64 " !", recordSize); - return E_INVALID_PARAMETERS; - } - } LOG_DEBUG(UDMF_SERVICE, "Processing udmf data in memory"); return E_OK; } diff --git a/framework/innerkitsimpl/data/unified_record.cpp b/framework/innerkitsimpl/data/unified_record.cpp index 7c3d4ebfc2768e1f913098d35b290cdace5c26d3..f645e66048d0b81d025615ffc18e7f4525cca820 100644 --- a/framework/innerkitsimpl/data/unified_record.cpp +++ b/framework/innerkitsimpl/data/unified_record.cpp @@ -54,7 +54,13 @@ void UnifiedRecord::SetType(const UDType &type) int64_t UnifiedRecord::GetSize() { - return 0; + if (std::holds_alternative>(value_)) { + auto value = std::get>(value_); + if (value->value_.size() == 1) { + return ObjectUtils::GetValueSize(value_, true); + } + } + return ObjectUtils::GetValueSize(value_, false); } std::string UnifiedRecord::GetUid() const @@ -209,7 +215,7 @@ void UnifiedRecord::InitObject() auto value = value_; value_ = std::make_shared(); auto object = std::get>(value_); - object->value_[VALUE_TYPE] = value; + object->value_.insert_or_assign(VALUE_TYPE, std::move(value)); } } diff --git a/framework/innerkitsimpl/data/video.cpp b/framework/innerkitsimpl/data/video.cpp index eb186c5c0e8413f93ccd81f315fb39fe19460a7f..afb99239dd0154321915be8de388dd8b7f2a47ca 100644 --- a/framework/innerkitsimpl/data/video.cpp +++ b/framework/innerkitsimpl/data/video.cpp @@ -19,16 +19,17 @@ namespace OHOS { namespace UDMF { Video::Video() : Video("") { + SetType(VIDEO); } Video::Video(const std::string &uri) : File(uri) { - this->dataType_ = VIDEO; + SetType(VIDEO); } Video::Video(UDType type, ValueType value) : File(type, value) { - this->dataType_ = VIDEO; + SetType(VIDEO); } } // namespace UDMF } // namespace OHOS \ No newline at end of file diff --git a/framework/innerkitsimpl/service/udmf_service_proxy.cpp b/framework/innerkitsimpl/service/udmf_service_proxy.cpp index f8b6c50bee3a247bf3d3380a50e87757af74f3f5..cca560f334dbd75a488ac322fce66d6bba55d564 100644 --- a/framework/innerkitsimpl/service/udmf_service_proxy.cpp +++ b/framework/innerkitsimpl/service/udmf_service_proxy.cpp @@ -79,6 +79,7 @@ int32_t UdmfServiceProxy::GetData(const QueryOption &query, UnifiedData &unified LOG_ERROR(UDMF_SERVICE, "Unmarshal UnifiedData failed!"); return E_READ_PARCEL_ERROR; } + UdmfConversion::ConvertRecordToSubclass(unifiedData); return status; } @@ -95,6 +96,7 @@ int32_t UdmfServiceProxy::GetBatchData(const QueryOption &query, std::vector(readData.GetRecordAt(0)); + EXPECT_EQ(4 * 1024 * 1024, readPixelMap1->GetRawData().size()); LOG_INFO(UDMF_TEST, "SetData004 end."); } @@ -232,12 +240,20 @@ HWTEST_F(UdmfClientSaInvokeTest, SetData006, TestSize.Level1) CustomOption option = { .intention = Intention::UD_INTENTION_DRAG }; std::vector rawData; - for (int i = 0; i < 3.5 * 1024 * 1024; i++) { + for (int i = 0; i < 5 * 1024 * 1024; i++) { rawData.emplace_back(1); } auto pixelMap = std::make_shared(rawData); UnifiedData data; data.AddRecord(pixelMap); + + std::vector rawData2; + for (int i = 0; i < 10 * 1024 * 1024; i++) { + rawData2.emplace_back(1); + } + auto pixelMap2 = std::make_shared(rawData2); + data.AddRecord(pixelMap2); + std::string key; auto status = UdmfClient::GetInstance().SetData(option, data, key); ASSERT_EQ(E_OK, status); @@ -246,10 +262,35 @@ HWTEST_F(UdmfClientSaInvokeTest, SetData006, TestSize.Level1) QueryOption queryOption = {.key = key}; status = UdmfClient::GetInstance().GetData(queryOption, readData); ASSERT_EQ(E_OK, status); - ASSERT_EQ(1, readData.GetRecords().size()); + ASSERT_EQ(2, readData.GetRecords().size()); auto readPixelMap = std::static_pointer_cast(readData.GetRecordAt(0)); - EXPECT_EQ(3.5 * 1024 * 1024, readPixelMap->GetRawData().size()); + EXPECT_EQ(5 * 1024 * 1024, readPixelMap->GetRawData().size()); + + auto readPixelMap2 = std::static_pointer_cast(readData.GetRecordAt(1)); + EXPECT_EQ(10 * 1024 * 1024, readPixelMap2->GetRawData().size()); LOG_INFO(UDMF_TEST, "SetData006 end."); } +/** +* @tc.name: SetData007 +* @tc.desc: Test set data error. Record size equals 4M. +* @tc.type: FUNC +*/ +HWTEST_F(UdmfClientSaInvokeTest, SetData007, TestSize.Level1) +{ + LOG_INFO(UDMF_TEST, "SetData007 begin."); + + CustomOption option = { .intention = Intention::UD_INTENTION_DRAG }; + std::vector rawData; + for (int i = 0; i < 128 * 1024 * 1024 + 1; i++) { + rawData.emplace_back(1); + } + auto pixelMap = std::make_shared(rawData); + UnifiedData data; + data.AddRecord(pixelMap); + std::string key; + auto status = UdmfClient::GetInstance().SetData(option, data, key); + ASSERT_EQ(E_INVALID_PARAMETERS, status); +} + } // OHOS::Test \ No newline at end of file diff --git a/framework/innerkitsimpl/test/unittest/udmf_client_test.cpp b/framework/innerkitsimpl/test/unittest/udmf_client_test.cpp index bd3a3df79cd8532cb1805ce88aa95c0e32a7f9cc..bcc834c3bfe3d1dca1f4d837bf9778e6e0a3158b 100644 --- a/framework/innerkitsimpl/test/unittest/udmf_client_test.cpp +++ b/framework/innerkitsimpl/test/unittest/udmf_client_test.cpp @@ -1233,6 +1233,18 @@ HWTEST_F(UdmfClientTest, GetSummary001, TestSize.Level1) std::shared_ptr record7 = std::make_shared(applicationDefinedRecord); data.AddRecord(record7); + std::shared_ptr obj = std::make_shared(); + obj->value_[UNIFORM_DATA_TYPE] = "general.file-uri"; + obj->value_[FILE_URI_PARAM] = "http://demo.com"; + obj->value_[FILE_TYPE] = "abcdefg"; + auto record8 = std::make_shared(FILE_URI, obj); + data.AddRecord(record8); + + auto record9 = std::make_shared(PNG, "http://demo.com"); + data.AddRecord(record9); + + + auto status = UdmfClient::GetInstance().SetData(option1, data, key); ASSERT_EQ(status, E_OK); @@ -1247,16 +1259,23 @@ HWTEST_F(UdmfClientTest, GetSummary001, TestSize.Level1) size += record5->GetSize(); size += record6->GetSize(); size += record7->GetSize(); - - ASSERT_EQ(status, E_OK); - ASSERT_EQ(summary.totalSize, size); - ASSERT_EQ(summary.summary["general.text"], record1->GetSize()); - ASSERT_EQ(summary.summary["general.plain-text"], record2->GetSize()); - ASSERT_EQ(summary.summary["general.file"], record3->GetSize()); - ASSERT_EQ(summary.summary["general.image"], record4->GetSize()); - ASSERT_EQ(summary.summary["SystemDefinedType"], record5->GetSize()); - ASSERT_EQ(summary.summary["openharmony.form"], record6->GetSize()); - ASSERT_EQ(summary.summary["ApplicationDefinedType"], record7->GetSize()); + size += record8->GetSize(); + size += record9->GetSize(); + + EXPECT_EQ(status, E_OK); + EXPECT_EQ(summary.totalSize, size); + EXPECT_EQ(summary.summary["general.text"], record1->GetSize()); + EXPECT_EQ(summary.summary["general.plain-text"], record2->GetSize()); + EXPECT_EQ(summary.summary["general.file"], record3->GetSize()); + EXPECT_EQ(summary.summary["general.image"], record4->GetSize()); + EXPECT_EQ(summary.summary["SystemDefinedType"], record5->GetSize()); + EXPECT_EQ(summary.summary["openharmony.form"], record6->GetSize()); + EXPECT_EQ(summary.summary["ApplicationDefinedType"], record7->GetSize()); + EXPECT_EQ(summary.summary["general.file-uri"], record8->GetSize()); + EXPECT_EQ(summary.summary["general.png"], record9->GetSize()); + + LOG_INFO(UDMF_TEST, "general.file-uri size = %{public}lld", summary.summary["general.file-uri"]); + LOG_INFO(UDMF_TEST, "general.png size = %{public}lld", summary.summary["general.png"]); LOG_INFO(UDMF_TEST, "GetSummary001 end."); } diff --git a/interfaces/innerkits/common/unified_meta.h b/interfaces/innerkits/common/unified_meta.h index 2926b499bafa4ec783353a4ce324d1888efb5235..932c9a8e9271cf5aa1296e261e1bb1450d698a48 100644 --- a/interfaces/innerkits/common/unified_meta.h +++ b/interfaces/innerkits/common/unified_meta.h @@ -624,8 +624,12 @@ struct API_EXPORT Object { }; namespace ObjectUtils { - std::shared_ptr ConvertToObject(UDDetails &details); - UDDetails ConvertToUDDetails(std::shared_ptr object); + std::shared_ptr API_EXPORT ConvertToObject(UDDetails &details); + UDDetails API_EXPORT ConvertToUDDetails(std::shared_ptr object); + + int64_t GetValueSize(ValueType value, bool isCalValueType); + int64_t GetObjectValueSize(std::shared_ptr object, bool isCalValueType); + int64_t GetAllObjectSize(std::shared_ptr object); template bool ConvertVariant(T &&input, std::variant &output) diff --git a/interfaces/innerkits/convert/udmf_conversion.h b/interfaces/innerkits/convert/udmf_conversion.h index 80e35de7a1b55883f336e476d7763e87a62debe1..ebef4e2ff4751a3b3871c356b2f7a6297a617688 100644 --- a/interfaces/innerkits/convert/udmf_conversion.h +++ b/interfaces/innerkits/convert/udmf_conversion.h @@ -17,17 +17,16 @@ #define UDMF_UDMF_CONVERSION_H #include "unified_data.h" -#include "visibility.h" namespace OHOS::UDMF { class UdmfConversion { public: - static void API_EXPORT ConvertRecordToSubclass(std::shared_ptr &record); - static void API_EXPORT ConvertRecordToSubclass(UnifiedData &data); - static void API_EXPORT ConvertRecordToSubclass(std::vector &datas); + static void ConvertRecordToSubclass(std::shared_ptr &record); + static void ConvertRecordToSubclass(UnifiedData &data); + static void ConvertRecordToSubclass(std::vector &datas); - static void API_EXPORT InitValueObject(UnifiedData &data); - static void API_EXPORT InitValueObject(std::vector &datas); + static void InitValueObject(UnifiedData &data); + static void InitValueObject(std::vector &datas); private: static void SetValueWhenNotUds(std::shared_ptr record);