forked from rsocket/rsocket-cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPayload.cpp
More file actions
102 lines (85 loc) · 2.71 KB
/
Payload.cpp
File metadata and controls
102 lines (85 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2004-present Facebook. All Rights Reserved.
#include "rsocket/Payload.h"
#include <folly/String.h>
#include <folly/io/Cursor.h>
#include "rsocket/framing/Frame.h"
namespace rsocket {
Payload::Payload(
std::unique_ptr<folly::IOBuf> _data,
std::unique_ptr<folly::IOBuf> _metadata)
: data(std::move(_data)), metadata(std::move(_metadata)) {}
Payload::Payload(const std::string& _data, const std::string& _metadata)
: data(folly::IOBuf::copyBuffer(_data)) {
if (!_metadata.empty()) {
metadata = folly::IOBuf::copyBuffer(_metadata);
}
}
void Payload::checkFlags(FrameFlags flags) const {
DCHECK(!!(flags & FrameFlags::METADATA) == bool(metadata));
}
std::ostream& operator<<(std::ostream& os, const Payload& payload) {
return os << "Metadata("
<< (payload.metadata
? folly::to<std::string>(
payload.metadata->computeChainDataLength())
: "0")
<< (payload.metadata
? "): '" +
folly::humanify(
payload.metadata->cloneAsValue().moveToFbString().substr(0, 80)) +
"'"
: "): <null>")
<< ", Data("
<< (payload.data ? folly::to<std::string>(
payload.data->computeChainDataLength())
: "0")
<< (payload.data
? "): '" +
folly::humanify(
payload.data->cloneAsValue().moveToFbString().substr(0, 80)) +
"'"
: "): <null>");
}
static std::string moveIOBufToString(std::unique_ptr<folly::IOBuf> iobuf) {
if (!iobuf) {
return "";
}
return iobuf->moveToFbString().toStdString();
}
static std::string cloneIOBufToString(
std::unique_ptr<folly::IOBuf> const& iobuf) {
if (!iobuf) {
return "";
}
return iobuf->cloneAsValue().moveToFbString().toStdString();
}
std::string Payload::moveDataToString() {
return moveIOBufToString(std::move(data));
}
std::string Payload::cloneDataToString() const {
return cloneIOBufToString(data);
}
std::string Payload::moveMetadataToString() {
return moveIOBufToString(std::move(metadata));
}
std::string Payload::cloneMetadataToString() const {
return cloneIOBufToString(metadata);
}
void Payload::clear() {
data.reset();
metadata.reset();
}
Payload Payload::clone() const {
Payload out;
if (data) {
out.data = data->clone();
}
if (metadata) {
out.metadata = metadata->clone();
}
return out;
}
FrameFlags Payload::getFlags() const {
return (metadata != nullptr ? FrameFlags::METADATA : FrameFlags::EMPTY);
}
} // namespace rsocket