114cf0368Sopenharmony_ci/*
214cf0368Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
314cf0368Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
414cf0368Sopenharmony_ci * you may not use this file except in compliance with the License.
514cf0368Sopenharmony_ci * You may obtain a copy of the License at
614cf0368Sopenharmony_ci *
714cf0368Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
814cf0368Sopenharmony_ci *
914cf0368Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1014cf0368Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1114cf0368Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1214cf0368Sopenharmony_ci * See the License for the specific language governing permissions and
1314cf0368Sopenharmony_ci * limitations under the License.
1414cf0368Sopenharmony_ci */
1514cf0368Sopenharmony_ci
1614cf0368Sopenharmony_ci#include "udmf_conversion.h"
1714cf0368Sopenharmony_ci#include "unified_data.h"
1814cf0368Sopenharmony_ci#include "application_defined_record.h"
1914cf0368Sopenharmony_ci#include "audio.h"
2014cf0368Sopenharmony_ci#include "file.h"
2114cf0368Sopenharmony_ci#include "folder.h"
2214cf0368Sopenharmony_ci#include "html.h"
2314cf0368Sopenharmony_ci#include "image.h"
2414cf0368Sopenharmony_ci#include "link.h"
2514cf0368Sopenharmony_ci#include "plain_text.h"
2614cf0368Sopenharmony_ci#include "system_defined_appitem.h"
2714cf0368Sopenharmony_ci#include "system_defined_form.h"
2814cf0368Sopenharmony_ci#include "system_defined_pixelmap.h"
2914cf0368Sopenharmony_ci#include "system_defined_record.h"
3014cf0368Sopenharmony_ci#include "text.h"
3114cf0368Sopenharmony_ci#include "unified_record.h"
3214cf0368Sopenharmony_ci#include "video.h"
3314cf0368Sopenharmony_ci#include <memory>
3414cf0368Sopenharmony_ci#include <utility>
3514cf0368Sopenharmony_ci
3614cf0368Sopenharmony_cinamespace OHOS::UDMF {
3714cf0368Sopenharmony_ci
3814cf0368Sopenharmony_civoid UdmfConversion::SetValueWhenNotUds(std::shared_ptr<UnifiedRecord> record)
3914cf0368Sopenharmony_ci{
4014cf0368Sopenharmony_ci    if (!std::holds_alternative<std::shared_ptr<Object>>(record->GetValue())) {
4114cf0368Sopenharmony_ci        return;
4214cf0368Sopenharmony_ci    }
4314cf0368Sopenharmony_ci    auto object = std::get<std::shared_ptr<Object>>(record->GetValue());
4414cf0368Sopenharmony_ci    auto it = object->value_.find(VALUE_TYPE);
4514cf0368Sopenharmony_ci    if (it == object->value_.end()) {
4614cf0368Sopenharmony_ci        return;
4714cf0368Sopenharmony_ci    }
4814cf0368Sopenharmony_ci    if (std::holds_alternative<std::shared_ptr<Object>>(it->second)) {
4914cf0368Sopenharmony_ci        return;
5014cf0368Sopenharmony_ci    }
5114cf0368Sopenharmony_ci    record->SetValue(it->second);
5214cf0368Sopenharmony_ci}
5314cf0368Sopenharmony_ci
5414cf0368Sopenharmony_civoid UdmfConversion::ConvertRecordToSubclass(std::shared_ptr<UnifiedRecord> &record)
5514cf0368Sopenharmony_ci{
5614cf0368Sopenharmony_ci    auto type = record->GetType();
5714cf0368Sopenharmony_ci    auto value = record->GetOriginValue();
5814cf0368Sopenharmony_ci    auto uid = record->GetUid();
5914cf0368Sopenharmony_ci    switch (type) {
6014cf0368Sopenharmony_ci        case UDType::TEXT: {
6114cf0368Sopenharmony_ci            record = std::make_shared<Text>(type, value);
6214cf0368Sopenharmony_ci            break;
6314cf0368Sopenharmony_ci        }
6414cf0368Sopenharmony_ci        case UDType::PLAIN_TEXT: {
6514cf0368Sopenharmony_ci            record = std::make_shared<PlainText>(type, value);
6614cf0368Sopenharmony_ci            break;
6714cf0368Sopenharmony_ci        }
6814cf0368Sopenharmony_ci        case UDType::HTML: {
6914cf0368Sopenharmony_ci            record = std::make_shared<Html>(type, value);
7014cf0368Sopenharmony_ci            break;
7114cf0368Sopenharmony_ci        }
7214cf0368Sopenharmony_ci        case UDType::HYPERLINK: {
7314cf0368Sopenharmony_ci            record = std::make_shared<Link>(type, value);
7414cf0368Sopenharmony_ci            break;
7514cf0368Sopenharmony_ci        }
7614cf0368Sopenharmony_ci        case UDType::FILE: {
7714cf0368Sopenharmony_ci            record = std::make_shared<File>(type, value);
7814cf0368Sopenharmony_ci            break;
7914cf0368Sopenharmony_ci        }
8014cf0368Sopenharmony_ci        case UDType::IMAGE: {
8114cf0368Sopenharmony_ci            record = std::make_shared<Image>(type, value);
8214cf0368Sopenharmony_ci            break;
8314cf0368Sopenharmony_ci        }
8414cf0368Sopenharmony_ci        case UDType::VIDEO: {
8514cf0368Sopenharmony_ci            record = std::make_shared<Video>(type, value);
8614cf0368Sopenharmony_ci            break;
8714cf0368Sopenharmony_ci        }
8814cf0368Sopenharmony_ci        case UDType::AUDIO: {
8914cf0368Sopenharmony_ci            record = std::make_shared<Audio>(type, value);
9014cf0368Sopenharmony_ci            break;
9114cf0368Sopenharmony_ci        }
9214cf0368Sopenharmony_ci        case UDType::FOLDER: {
9314cf0368Sopenharmony_ci            record = std::make_shared<Folder>(type, value);
9414cf0368Sopenharmony_ci            break;
9514cf0368Sopenharmony_ci        }
9614cf0368Sopenharmony_ci        case UDType::SYSTEM_DEFINED_RECORD: {
9714cf0368Sopenharmony_ci            record = std::make_shared<SystemDefinedRecord>(type, value);
9814cf0368Sopenharmony_ci            break;
9914cf0368Sopenharmony_ci        }
10014cf0368Sopenharmony_ci        case UDType::SYSTEM_DEFINED_FORM: {
10114cf0368Sopenharmony_ci            record = std::make_shared<SystemDefinedForm>(type, value);
10214cf0368Sopenharmony_ci            break;
10314cf0368Sopenharmony_ci        }
10414cf0368Sopenharmony_ci        case UDType::SYSTEM_DEFINED_APP_ITEM: {
10514cf0368Sopenharmony_ci            record = std::make_shared<SystemDefinedAppItem>(type, value);
10614cf0368Sopenharmony_ci            break;
10714cf0368Sopenharmony_ci        }
10814cf0368Sopenharmony_ci        case UDType::SYSTEM_DEFINED_PIXEL_MAP: {
10914cf0368Sopenharmony_ci            record = std::make_shared<SystemDefinedPixelMap>(type, value);
11014cf0368Sopenharmony_ci            break;
11114cf0368Sopenharmony_ci        }
11214cf0368Sopenharmony_ci        case UDType::APPLICATION_DEFINED_RECORD: {
11314cf0368Sopenharmony_ci            record = std::make_shared<ApplicationDefinedRecord>(type, value);
11414cf0368Sopenharmony_ci            break;
11514cf0368Sopenharmony_ci        }
11614cf0368Sopenharmony_ci        default: {
11714cf0368Sopenharmony_ci            record = std::make_shared<UnifiedRecord>(type, value);
11814cf0368Sopenharmony_ci        }
11914cf0368Sopenharmony_ci    }
12014cf0368Sopenharmony_ci    record->SetUid(uid);
12114cf0368Sopenharmony_ci    SetValueWhenNotUds(record);
12214cf0368Sopenharmony_ci}
12314cf0368Sopenharmony_ci
12414cf0368Sopenharmony_civoid UdmfConversion::ConvertRecordToSubclass(UnifiedData &data)
12514cf0368Sopenharmony_ci{
12614cf0368Sopenharmony_ci    std::vector<std::shared_ptr<UnifiedRecord>> records;
12714cf0368Sopenharmony_ci    for (auto &record : data.GetRecords()) {
12814cf0368Sopenharmony_ci        ConvertRecordToSubclass(record);
12914cf0368Sopenharmony_ci        records.push_back(std::move(record));
13014cf0368Sopenharmony_ci    }
13114cf0368Sopenharmony_ci    data.SetRecords(records);
13214cf0368Sopenharmony_ci}
13314cf0368Sopenharmony_ci
13414cf0368Sopenharmony_civoid UdmfConversion::ConvertRecordToSubclass(std::vector<UnifiedData> &datas)
13514cf0368Sopenharmony_ci{
13614cf0368Sopenharmony_ci    for (auto &data : datas) {
13714cf0368Sopenharmony_ci        ConvertRecordToSubclass(data);
13814cf0368Sopenharmony_ci    }
13914cf0368Sopenharmony_ci}
14014cf0368Sopenharmony_ci
14114cf0368Sopenharmony_civoid UdmfConversion::InitValueObject(UnifiedData &data)
14214cf0368Sopenharmony_ci{
14314cf0368Sopenharmony_ci    for (auto &record : data.GetRecords()) {
14414cf0368Sopenharmony_ci        record->InitObject();
14514cf0368Sopenharmony_ci    }
14614cf0368Sopenharmony_ci}
14714cf0368Sopenharmony_ci
14814cf0368Sopenharmony_civoid UdmfConversion::InitValueObject(std::vector<UnifiedData> &datas)
14914cf0368Sopenharmony_ci{
15014cf0368Sopenharmony_ci    for (auto &data : datas) {
15114cf0368Sopenharmony_ci        InitValueObject(data);
15214cf0368Sopenharmony_ci    }
15314cf0368Sopenharmony_ci}
15414cf0368Sopenharmony_ci}
155