blob: baed8c60dc299c59f6cd23de79977449faab2fea [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "peridot/bin/sessionmgr/storage/story_storage_xdr.h"
#include "peridot/lib/module_manifest/module_manifest_xdr.h"
#include <lib/fidl/cpp/clone.h>
#include <lib/fsl/vmo/strings.h>
namespace modular {
void XdrLinkPath(XdrContext* const xdr,
fuchsia::modular::LinkPath* const data) {
xdr->Field("module_path", &data->module_path);
xdr->Field("link_name", &data->link_name);
}
void XdrModuleParameterMapEntry(
XdrContext* const xdr,
fuchsia::modular::ModuleParameterMapEntry* const data) {
// NOTE: the JSON field naming doesn't match the FIDL struct naming because
// the field names in FIDL were changed.
xdr->Field("key", &data->name);
xdr->Field("link_path", &data->link_path, XdrLinkPath);
}
void XdrModuleParameterMap(XdrContext* const xdr,
fuchsia::modular::ModuleParameterMap* const data) {
// NOTE: the JSON field naming doesn't match the FIDL struct naming because
// the field names in FIDL were changed.
xdr->Field("key_to_link_map", &data->entries, XdrModuleParameterMapEntry);
}
void XdrSurfaceRelation(XdrContext* const xdr,
fuchsia::modular::SurfaceRelation* const data) {
xdr->Field("arrangement", &data->arrangement);
xdr->Field("dependency", &data->dependency);
xdr->Field("emphasis", &data->emphasis);
}
void XdrIntentParameterData(XdrContext* const xdr,
fuchsia::modular::IntentParameterData* const data) {
static constexpr char kTag[] = "tag";
static constexpr char kEntityReference[] = "entity_reference";
static constexpr char kJson[] = "json";
static constexpr char kEntityType[] = "entity_type";
switch (xdr->op()) {
case XdrOp::FROM_JSON: {
std::string tag;
xdr->Field(kTag, &tag);
if (tag == kEntityReference) {
fidl::StringPtr value;
xdr->Field(kEntityReference, &value);
data->set_entity_reference(std::move(value));
} else if (tag == kJson) {
fidl::StringPtr value;
xdr->Field(kJson, &value);
fsl::SizedVmo vmo;
FXL_CHECK(fsl::VmoFromString(*value, &vmo));
data->set_json(std::move(vmo).ToTransport());
} else if (tag == kEntityType) {
::std::vector<::std::string> value;
xdr->Field(kEntityType, &value);
data->set_entity_type(std::move(value));
} else {
FXL_LOG(ERROR) << "XdrIntentParameterData FROM_JSON unknown tag: "
<< tag;
}
break;
}
case XdrOp::TO_JSON: {
std::string tag;
switch (data->Which()) {
case fuchsia::modular::IntentParameterData::Tag::kEntityReference: {
tag = kEntityReference;
fidl::StringPtr value = data->entity_reference();
xdr->Field(kEntityReference, &value);
break;
}
case fuchsia::modular::IntentParameterData::Tag::kJson: {
tag = kJson;
std::string json_string;
FXL_CHECK(fsl::StringFromVmo(data->json(), &json_string));
fidl::StringPtr value = json_string;
xdr->Field(kJson, &value);
break;
}
case fuchsia::modular::IntentParameterData::Tag::kEntityType: {
tag = kEntityType;
std::vector<std::string> value = data->entity_type();
xdr->Field(kEntityType, &value);
break;
}
case fuchsia::modular::IntentParameterData::Tag::Invalid:
FXL_LOG(ERROR) << "XdrIntentParameterData TO_JSON unknown tag: "
<< static_cast<int>(data->Which());
break;
}
xdr->Field(kTag, &tag);
break;
}
}
}
void XdrIntentParameter(XdrContext* const xdr,
fuchsia::modular::IntentParameter* const data) {
xdr->Field("name", &data->name);
xdr->Field("data", &data->data, XdrIntentParameterData);
}
void XdrIntent(XdrContext* const xdr, fuchsia::modular::Intent* const data) {
xdr->Field("action_name", &data->action);
xdr->Field("action_handler", &data->handler);
xdr->Field("parameters", &data->parameters, XdrIntentParameter);
}
void XdrModuleData_v1(XdrContext* const xdr,
fuchsia::modular::ModuleData* const data) {
xdr->Field("url", &data->module_url);
xdr->Field("module_path", &data->module_path);
xdr->Field("module_source", &data->module_source);
xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
xdr->Field("module_stopped", &data->module_deleted);
xdr->Field("intent", &data->intent, XdrIntent);
// In previous versions we did not have these fields.
data->parameter_map.entries.resize(0);
}
void XdrModuleData_v2(XdrContext* const xdr,
fuchsia::modular::ModuleData* const data) {
xdr->Field("url", &data->module_url);
xdr->Field("module_path", &data->module_path);
xdr->Field("module_source", &data->module_source);
xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
xdr->Field("module_stopped", &data->module_deleted);
xdr->Field("intent", &data->intent, XdrIntent);
// NOTE: the JSON field naming doesn't match the FIDL struct naming because
// the field name in FIDL was changed.
xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
}
void XdrModuleData_v3(XdrContext* const xdr,
fuchsia::modular::ModuleData* const data) {
xdr->Field("url", &data->module_url);
xdr->Field("module_path", &data->module_path);
xdr->Field("module_source", &data->module_source);
xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
xdr->Field("module_stopped", &data->module_deleted);
xdr->Field("intent", &data->intent, XdrIntent);
// NOTE: the JSON field naming doesn't match the FIDL struct naming because
// the field name in FIDL was changed.
xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
}
void XdrModuleData_v4(XdrContext* const xdr,
fuchsia::modular::ModuleData* const data) {
if (!xdr->Version(4)) {
return;
}
xdr->Field("url", &data->module_url);
xdr->Field("module_path", &data->module_path);
xdr->Field("module_source", &data->module_source);
xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
xdr->Field("module_stopped", &data->module_deleted);
xdr->Field("intent", &data->intent, XdrIntent);
// NOTE: the JSON field naming doesn't match the FIDL struct naming because
// the field name in FIDL was changed.
xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
}
void XdrModuleData_v5(XdrContext* const xdr,
fuchsia::modular::ModuleData* const data) {
if (!xdr->Version(5)) {
return;
}
xdr->Field("url", &data->module_url);
xdr->Field("module_path", &data->module_path);
xdr->Field("module_source", &data->module_source);
xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
xdr->Field("module_deleted", &data->module_deleted);
xdr->Field("intent", &data->intent, XdrIntent);
// NOTE: the JSON field naming doesn't match the FIDL struct naming because
// the field name in FIDL was changed.
xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
}
void XdrModuleData_v6(XdrContext* const xdr,
fuchsia::modular::ModuleData* const data) {
if (!xdr->Version(6)) {
return;
}
xdr->Field("url", &data->module_url);
xdr->Field("module_path", &data->module_path);
xdr->Field("module_source", &data->module_source);
xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
xdr->Field("module_deleted", &data->module_deleted);
xdr->Field("intent", &data->intent, XdrIntent);
// NOTE: the JSON field naming doesn't match the FIDL struct naming because
// the field name in FIDL was changed.
xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
xdr->Field("is_embedded", &data->is_embedded);
}
XdrFilterType<fuchsia::modular::ModuleData> XdrModuleData[] = {
XdrModuleData_v6, XdrModuleData_v5, XdrModuleData_v4, XdrModuleData_v3,
XdrModuleData_v2, XdrModuleData_v1, nullptr,
};
} // namespace modular