1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci 16020a203aSopenharmony_ci#include "hiview_file_info.h" 17020a203aSopenharmony_ci 18020a203aSopenharmony_ci#include "hiview_logger.h" 19020a203aSopenharmony_ci#include "securec.h" 20020a203aSopenharmony_ci 21020a203aSopenharmony_cinamespace OHOS { 22020a203aSopenharmony_cinamespace HiviewDFX { 23020a203aSopenharmony_ciDEFINE_LOG_TAG("LOGLIBRARY_FILE_INFO"); 24020a203aSopenharmony_civoid* HiviewFileInfo::GetData(uint32_t& dataSize) const 25020a203aSopenharmony_ci{ 26020a203aSopenharmony_ci Parcel outParcel; 27020a203aSopenharmony_ci if (!outParcel.WriteString(name)) { 28020a203aSopenharmony_ci return nullptr; 29020a203aSopenharmony_ci } 30020a203aSopenharmony_ci if (!outParcel.WriteInt64(mtime)) { 31020a203aSopenharmony_ci return nullptr; 32020a203aSopenharmony_ci } 33020a203aSopenharmony_ci if (!outParcel.WriteUint64(size)) { 34020a203aSopenharmony_ci return nullptr; 35020a203aSopenharmony_ci } 36020a203aSopenharmony_ci size_t size = outParcel.GetDataSize(); 37020a203aSopenharmony_ci const size_t maxSize = 1024; 38020a203aSopenharmony_ci if (size == 0 || size > maxSize) { 39020a203aSopenharmony_ci HIVIEW_LOGE("invalid size."); 40020a203aSopenharmony_ci return nullptr; 41020a203aSopenharmony_ci } 42020a203aSopenharmony_ci void* data = malloc(size); 43020a203aSopenharmony_ci if (data == nullptr) { 44020a203aSopenharmony_ci HIVIEW_LOGE("invalid data."); 45020a203aSopenharmony_ci return nullptr; 46020a203aSopenharmony_ci } 47020a203aSopenharmony_ci memset_s(data, size, 0, size); 48020a203aSopenharmony_ci if (memcpy_s(data, size, reinterpret_cast<void*>(outParcel.GetData()), size) != 0) { 49020a203aSopenharmony_ci HIVIEW_LOGE("copy failed."); 50020a203aSopenharmony_ci free(data); 51020a203aSopenharmony_ci return nullptr; 52020a203aSopenharmony_ci } 53020a203aSopenharmony_ci dataSize = size; 54020a203aSopenharmony_ci return data; 55020a203aSopenharmony_ci} 56020a203aSopenharmony_ci 57020a203aSopenharmony_ciHiviewFileInfo HiviewFileInfo::ParseData(const char* data, const uint32_t dataSize) 58020a203aSopenharmony_ci{ 59020a203aSopenharmony_ci if (data == nullptr) { 60020a203aSopenharmony_ci HIVIEW_LOGE("param invalid."); 61020a203aSopenharmony_ci return HiviewFileInfo("", 0, 0); 62020a203aSopenharmony_ci } 63020a203aSopenharmony_ci Parcel inParcel; 64020a203aSopenharmony_ci inParcel.WriteBuffer(data, dataSize); 65020a203aSopenharmony_ci std::string name; 66020a203aSopenharmony_ci if (!inParcel.ReadString(name)) { 67020a203aSopenharmony_ci return HiviewFileInfo("", 0, 0); 68020a203aSopenharmony_ci } 69020a203aSopenharmony_ci time_t mtime; 70020a203aSopenharmony_ci if (!inParcel.ReadInt64(mtime)) { 71020a203aSopenharmony_ci return HiviewFileInfo("", 0, 0); 72020a203aSopenharmony_ci } 73020a203aSopenharmony_ci uint64_t size; 74020a203aSopenharmony_ci if (!inParcel.ReadUint64(size)) { 75020a203aSopenharmony_ci return HiviewFileInfo("", 0, 0); 76020a203aSopenharmony_ci } 77020a203aSopenharmony_ci return HiviewFileInfo(name, mtime, size); 78020a203aSopenharmony_ci} 79020a203aSopenharmony_ci} // namespace HiviewDFX 80020a203aSopenharmony_ci} // namespace OHOS