18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci 168bf80f4bSopenharmony_ci#include "serialisation_utils.h" 178bf80f4bSopenharmony_ci 188bf80f4bSopenharmony_ci#include <algorithm> 198bf80f4bSopenharmony_ci#include <cstring> 208bf80f4bSopenharmony_ci 218bf80f4bSopenharmony_ci#include <core/io/intf_file_manager.h> 228bf80f4bSopenharmony_ci 238bf80f4bSopenharmony_ci#include <meta/interface/builtin_objects.h> 248bf80f4bSopenharmony_ci#include <meta/interface/intf_object_registry.h> 258bf80f4bSopenharmony_ci#include <meta/interface/serialization/intf_exporter.h> 268bf80f4bSopenharmony_ci#include <meta/interface/serialization/intf_importer.h> 278bf80f4bSopenharmony_ci 288bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 298bf80f4bSopenharmony_ci 308bf80f4bSopenharmony_ciMemFile::MemFile(BASE_NS::vector<char> vec) : data_(BASE_NS::move(vec)) {} 318bf80f4bSopenharmony_ci 328bf80f4bSopenharmony_ciMemFile::Mode MemFile::GetMode() const 338bf80f4bSopenharmony_ci{ 348bf80f4bSopenharmony_ci return Mode::READ_WRITE; 358bf80f4bSopenharmony_ci} 368bf80f4bSopenharmony_civoid MemFile::Close() 378bf80f4bSopenharmony_ci{ 388bf80f4bSopenharmony_ci data_.clear(); 398bf80f4bSopenharmony_ci} 408bf80f4bSopenharmony_ciuint64_t MemFile::Read(void* buffer, uint64_t count) 418bf80f4bSopenharmony_ci{ 428bf80f4bSopenharmony_ci size_t read = std::min<size_t>(count, data_.size() - pos_); 438bf80f4bSopenharmony_ci pos_ += read; 448bf80f4bSopenharmony_ci return read; 458bf80f4bSopenharmony_ci} 468bf80f4bSopenharmony_ciuint64_t MemFile::Write(const void* buffer, uint64_t count) 478bf80f4bSopenharmony_ci{ 488bf80f4bSopenharmony_ci if (data_.size() < pos_ + count) { 498bf80f4bSopenharmony_ci data_.resize(pos_ + count); 508bf80f4bSopenharmony_ci } 518bf80f4bSopenharmony_ci pos_ += count; 528bf80f4bSopenharmony_ci return count; 538bf80f4bSopenharmony_ci} 548bf80f4bSopenharmony_ciuint64_t MemFile::GetLength() const 558bf80f4bSopenharmony_ci{ 568bf80f4bSopenharmony_ci return data_.size(); 578bf80f4bSopenharmony_ci} 588bf80f4bSopenharmony_cibool MemFile::Seek(uint64_t offset) 598bf80f4bSopenharmony_ci{ 608bf80f4bSopenharmony_ci bool ret = offset < data_.size(); 618bf80f4bSopenharmony_ci if (ret) { 628bf80f4bSopenharmony_ci pos_ = offset; 638bf80f4bSopenharmony_ci } 648bf80f4bSopenharmony_ci return ret; 658bf80f4bSopenharmony_ci} 668bf80f4bSopenharmony_ciuint64_t MemFile::GetPosition() const 678bf80f4bSopenharmony_ci{ 688bf80f4bSopenharmony_ci return pos_; 698bf80f4bSopenharmony_ci} 708bf80f4bSopenharmony_ciBASE_NS::vector<char> MemFile::Data() const 718bf80f4bSopenharmony_ci{ 728bf80f4bSopenharmony_ci return data_; 738bf80f4bSopenharmony_ci} 748bf80f4bSopenharmony_civoid MemFile::Destroy() 758bf80f4bSopenharmony_ci{ 768bf80f4bSopenharmony_ci delete this; 778bf80f4bSopenharmony_ci} 788bf80f4bSopenharmony_ci 798bf80f4bSopenharmony_ciTestSerialiser::TestSerialiser(BASE_NS::vector<char> vec) : data_(BASE_NS::move(vec)) {} 808bf80f4bSopenharmony_ci 818bf80f4bSopenharmony_cibool TestSerialiser::Export(const IObject::Ptr& object) 828bf80f4bSopenharmony_ci{ 838bf80f4bSopenharmony_ci data_.Seek(writePos_); 848bf80f4bSopenharmony_ci auto exporter = GetObjectRegistry().Create<IFileExporter>(META_NS::ClassId::JsonExporter); 858bf80f4bSopenharmony_ci bool ret = exporter->Export(data_, object); 868bf80f4bSopenharmony_ci writePos_ = data_.GetPosition(); 878bf80f4bSopenharmony_ci return ret; 888bf80f4bSopenharmony_ci} 898bf80f4bSopenharmony_ci 908bf80f4bSopenharmony_civoid TestSerialiser::SetSerializationSettings(SerializationSettings s) 918bf80f4bSopenharmony_ci{ 928bf80f4bSopenharmony_ci auto& ctx = GetObjectRegistry().GetGlobalSerializationData(); 938bf80f4bSopenharmony_ci ctx.SetDefaultSettings(s); 948bf80f4bSopenharmony_ci} 958bf80f4bSopenharmony_ci 968bf80f4bSopenharmony_ciIObject::Ptr TestSerialiser::Import() 978bf80f4bSopenharmony_ci{ 988bf80f4bSopenharmony_ci data_.Seek(readPos_); 998bf80f4bSopenharmony_ci auto importer = GetObjectRegistry().Create<IFileImporter>(META_NS::ClassId::JsonImporter); 1008bf80f4bSopenharmony_ci IObject::Ptr result = importer->Import(data_); 1018bf80f4bSopenharmony_ci readPos_ = data_.GetPosition(); 1028bf80f4bSopenharmony_ci return result; 1038bf80f4bSopenharmony_ci} 1048bf80f4bSopenharmony_ci 1058bf80f4bSopenharmony_cibool TestSerialiser::LoadFile(BASE_NS::string_view path) 1068bf80f4bSopenharmony_ci{ 1078bf80f4bSopenharmony_ci auto f = CORE_NS::GetPluginRegister().GetFileManager().OpenFile(path); 1088bf80f4bSopenharmony_ci if (!f) { 1098bf80f4bSopenharmony_ci return false; 1108bf80f4bSopenharmony_ci } 1118bf80f4bSopenharmony_ci 1128bf80f4bSopenharmony_ci BASE_NS::vector<char> vec; 1138bf80f4bSopenharmony_ci vec.resize(f->GetLength()); 1148bf80f4bSopenharmony_ci f->Read(vec.data(), vec.size()); 1158bf80f4bSopenharmony_ci data_ = MemFile { BASE_NS::move(vec) }; 1168bf80f4bSopenharmony_ci return true; 1178bf80f4bSopenharmony_ci} 1188bf80f4bSopenharmony_ci 1198bf80f4bSopenharmony_civoid TestSerialiser::Dump(BASE_NS::string_view file) 1208bf80f4bSopenharmony_ci{ 1218bf80f4bSopenharmony_ci WriteToFile(data_.Data(), file); 1228bf80f4bSopenharmony_ci} 1238bf80f4bSopenharmony_ci 1248bf80f4bSopenharmony_ciBASE_NS::string TestSerialiser::Get() const 1258bf80f4bSopenharmony_ci{ 1268bf80f4bSopenharmony_ci return BASE_NS::string(BASE_NS::string_view(data_.Data().data(), data_.Data().size())); 1278bf80f4bSopenharmony_ci} 1288bf80f4bSopenharmony_ci 1298bf80f4bSopenharmony_civoid WriteToFile(const BASE_NS::vector<char>& vec, BASE_NS::string_view file) 1308bf80f4bSopenharmony_ci{ 1318bf80f4bSopenharmony_ci auto f = CORE_NS::GetPluginRegister().GetFileManager().CreateFile(file); 1328bf80f4bSopenharmony_ci if (f) { 1338bf80f4bSopenharmony_ci f->Write(vec.data(), vec.size()); 1348bf80f4bSopenharmony_ci f->Close(); 1358bf80f4bSopenharmony_ci } 1368bf80f4bSopenharmony_ci} 1378bf80f4bSopenharmony_ci 1388bf80f4bSopenharmony_ciMETA_END_NAMESPACE()