// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_ #define MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_ #include #include #include "mojo/public/cpp/bindings/lib/array_internal.h" #include "mojo/public/cpp/bindings/lib/serialization_forward.h" #include "mojo/public/cpp/bindings/lib/serialization_util.h" #include "mojo/public/cpp/bindings/string.h" #include "mojo/public/cpp/bindings/string_traits.h" namespace mojo { namespace internal { template struct Serializer { using UserType = typename std::remove_const::type; using Traits = StringTraits; static size_t PrepareToSerialize(MaybeConstUserType& input, SerializationContext* context) { if (CallIsNullIfExists(input)) return 0; void* custom_context = CustomContextHelper::SetUp(input, context); return Align(sizeof(String_Data) + CallWithContext(Traits::GetSize, input, custom_context)); } static void Serialize(MaybeConstUserType& input, Buffer* buffer, String_Data** output, SerializationContext* context) { if (CallIsNullIfExists(input)) { *output = nullptr; return; } void* custom_context = CustomContextHelper::GetNext(context); String_Data* result = String_Data::New( CallWithContext(Traits::GetSize, input, custom_context), buffer); if (result) { memcpy(result->storage(), CallWithContext(Traits::GetData, input, custom_context), CallWithContext(Traits::GetSize, input, custom_context)); } *output = result; CustomContextHelper::TearDown(input, custom_context); } static bool Deserialize(String_Data* input, UserType* output, SerializationContext* context) { if (!input) return CallSetToNullIfExists(output); return Traits::Read(StringDataView(input), output); } }; } // namespace internal } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_