Android-cuttlefish cvd tool
packet.h
Go to the documentation of this file.
1//
2// Copyright (C) 2021 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#pragma once
17
18#include <stdint.h>
19
20#include <optional>
21#include <sstream>
22#include <string>
23#include <vector>
24
29
51
52/*
53 * methods in namespace impl is not intended for public use
54 *
55 * For exposed APIs, skip to "start of public APIs
56 * or, skip the namespace impl
57 */
58namespace impl {
59
60template <typename Buffer, typename... Args>
61void AppendToBuffer(Buffer& buffer, Args&&... args) {
62 (buffer.insert(buffer.end(), std::begin(std::forward<Args>(args)),
63 std::end(std::forward<Args>(args))),
64 ...);
65}
66
67template <typename... Args>
68std::vector<int> MakeSizeHeader(Args&&... args) {
69 std::vector<int> lengths;
70 (lengths.push_back(std::distance(std::begin(args), std::end(args))), ...);
71 return lengths;
72}
73
74// Use only this function to make a packet to send over the confirmation
75// ui packet layer
76template <typename... Args>
77Payload ToPayload(const std::string& cmd_str, const std::string& session_id,
78 Args&&... args) {
80 constexpr auto n_args = sizeof...(Args);
81 std::stringstream ss;
82 ss << ArgsToString(session_id, ":", cmd_str, ":", n_args, ":");
83 // create size header
84 std::vector<int> size_info =
85 impl::MakeSizeHeader(std::forward<Args>(args)...);
86 for (const auto sz : size_info) {
87 ss << sz << ":";
88 }
89 std::string header = ss.str();
90 std::vector<uint8_t> payload_buffer{header.begin(), header.end()};
91 impl::AppendToBuffer(payload_buffer, std::forward<Args>(args)...);
92
94 ph.payload_length_ = payload_buffer.size();
95 return {ph, payload_buffer};
96}
97
98} // namespace impl
99
100/*
101 * start of public methods
102 */
103std::optional<ParsedPacket> ReadPayload(SharedFD s);
104
105template <typename... Args>
106bool WritePayload(SharedFD d, const std::string& cmd_str,
107 const std::string& session_id, Args&&... args) {
108 // TODO(kwstephenkim): type check Args... so that they are either
109 // kind of std::string or std::vector<1 byte>
110 if (!d->IsOpen()) {
111 ConfUiLog(ERROR) << "file, socket, etc, is not open to write";
112 return false;
113 }
114 auto [payload_header, data_to_send] =
115 impl::ToPayload(cmd_str, session_id, std::forward<Args>(args)...);
116 const std::string data_in_str(data_to_send.cbegin(), data_to_send.cend());
117
118 auto nwrite = WriteAll(d, reinterpret_cast<const char*>(&payload_header),
119 sizeof(payload_header));
120 if (nwrite != sizeof(payload_header)) {
121 return false;
122 }
123 nwrite = WriteAll(d, reinterpret_cast<const char*>(data_to_send.data()),
124 data_to_send.size());
125 if (nwrite != data_to_send.size()) {
126 return false;
127 }
128 return true;
129}
130
131} // namespace cuttlefish::confui::packet
Definition: shared_fd.h:124
#define ConfUiLog(LOG_LEVEL)
Definition: utils.h:60
ResponseHeader header
Definition: incremental_server.cpp:0
@ ERROR
Definition: logging.h:92
Definition: packet.h:58
Payload ToPayload(const std::string &cmd_str, const std::string &session_id, Args &&... args)
Definition: packet.h:77
void AppendToBuffer(Buffer &buffer, Args &&... args)
Definition: packet.h:61
std::vector< int > MakeSizeHeader(Args &&... args)
Definition: packet.h:68
Definition: packet.cpp:33
std::tuple< PayloadHeader, BufferType > Payload
Definition: packet_types.h:33
std::optional< ParsedPacket > ReadPayload(SharedFD s)
Definition: packet.cpp:153
bool WritePayload(SharedFD d, const std::string &cmd_str, const std::string &session_id, Args &&... args)
Definition: packet.h:106
std::string ArgsToString(Args &&... args)
Definition: utils.h:50
ssize_t WriteAll(SharedFD fd, const char *buf, size_t size)
Definition: shared_buf.cc:27
std::vector< std::string_view > Args
Definition: incremental.h:28
Definition: packet_types.h:26
uint32_t payload_length_
Definition: packet_types.h:27