blob: 3cead0d9d11bf20b45f5b157d2f4466ac91f0e28 [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.
#ifndef SRC_DEVELOPER_DEBUG_IPC_PROTOCOL_HELPERS_H_
#define SRC_DEVELOPER_DEBUG_IPC_PROTOCOL_HELPERS_H_
#include <string>
#include <vector>
#include "src/developer/debug/ipc/message_reader.h"
#include "src/developer/debug/ipc/message_writer.h"
#include "src/developer/debug/ipc/records.h"
#include "src/developer/debug/shared/address_range.h"
namespace debug_ipc {
// This file contains common serializers and deserializers for types. If a
// type is only used once, the corresponding reader/writer would go in the
// [agent|client]_protocol.cc file that needs it.
// Trivial primitive type ones. These allow the vector serializer below to be
// used to [de]serialize a vector of strings or ints.
void Serialize(const std::string& s, MessageWriter* writer);
bool Deserialize(MessageReader* reader, std::string* s);
void Serialize(uint64_t data, MessageWriter* writer);
bool Deserialize(MessageReader* reader, uint64_t* data);
void Serialize(int32_t data, MessageWriter* writer);
bool Deserialize(MessageReader* reader, int32_t* data);
// Aggregate types that are serialized in both directions (otherwise the
// implementations would go into the client-/agent-specific file).
void Serialize(const Register& reg, MessageWriter* writer);
bool Deserialize(MessageReader* reader, Register* reg);
void Serialize(RegisterCategory type, MessageWriter* writer);
bool Deserialize(MessageReader* reader, RegisterCategory* reg_cat);
void Serialize(const AddressRange& range, MessageWriter* writer);
bool Deserialize(MessageReader* reader, AddressRange* range);
void Serialize(ExceptionType type, MessageWriter* writer);
bool Deserialize(MessageReader* reader, ExceptionType* type);
void Serialize(ExceptionStrategy strategy, MessageWriter* writer);
bool Deserialize(MessageReader* reader, ExceptionStrategy* strategy);
void Serialize(UpdateGlobalSettingsRequest::UpdateExceptionStrategy strategy,
MessageWriter* writer);
bool Deserialize(MessageReader* reader,
UpdateGlobalSettingsRequest::UpdateExceptionStrategy* strategy);
// Will call Serialize for each element in the vector.
template <typename T>
inline void Serialize(const std::vector<T>& v, MessageWriter* writer) {
uint32_t size = static_cast<uint32_t>(v.size());
writer->WriteUint32(size);
for (uint32_t i = 0; i < size; i++)
Serialize(v[i], writer);
}
template <>
inline void Serialize(const std::vector<uint8_t>& v, MessageWriter* writer) {
uint32_t size = static_cast<uint32_t>(v.size());
writer->WriteUint32(size);
if (size > 0)
writer->WriteBytes(&v[0], size);
}
template <>
inline void Serialize(const std::vector<InfoHandle>& v, MessageWriter* writer) {
uint32_t size = static_cast<uint32_t>(v.size());
writer->WriteUint32(size);
if (size > 0)
writer->WriteBytes(&v[0], size * sizeof(InfoHandle));
}
// Will call Deserialize for each element in the vector.
template <typename T>
inline bool Deserialize(MessageReader* reader, std::vector<T>* v) {
uint32_t size = 0;
if (!reader->ReadUint32(&size))
return false;
v->resize(size);
for (uint32_t i = 0; i < size; i++) {
if (!Deserialize(reader, &(*v)[i]))
return false;
}
return true;
}
template <>
inline bool Deserialize(MessageReader* reader, std::vector<uint8_t>* v) {
uint32_t size = 0;
if (!reader->ReadUint32(&size))
return false;
v->resize(size);
if (size == 0)
return true;
return reader->ReadBytes(size, &(*v)[0]);
}
template <>
inline bool Deserialize(MessageReader* reader, std::vector<InfoHandle>* v) {
uint32_t size = 0;
if (!reader->ReadUint32(&size))
return false;
v->resize(size);
if (size == 0)
return true;
return reader->ReadBytes(size * sizeof(InfoHandle), &(*v)[0]);
}
} // namespace debug_ipc
#endif // SRC_DEVELOPER_DEBUG_IPC_PROTOCOL_HELPERS_H_