-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata_channel_socket.cpp
132 lines (103 loc) · 3.02 KB
/
data_channel_socket.cpp
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
// Created by csw on 2021/7/7.
//
#include "data_channel_socket.h"
#include "socket_pair.h"
struct DataChannelSocket::_impl_t {
_impl_t(DataChannelSocket *wrapper, rtc::scoped_refptr<webrtc::DataChannelInterface> &channel) : m_wrapper(wrapper), m_channel(channel), m_handle(0) {
m_buffer.resize(1024);
memset(m_fd, -1, sizeof(m_fd));
}
int start() {
m_channel->RegisterObserver(m_wrapper);
m_handle = SocketPair::instance()->create_pair(m_fd);
if (m_handle == 0) {
return -1;
}
return 0;
}
int stop() {
m_channel->UnregisterObserver();
SocketPair::instance()->delete_pair(m_handle);
return 0;
}
int transfer() {
while (m_wrapper->running()) {
int ret = read_sink((char*)&m_buffer[0], m_buffer.size());
if (ret == 0) {
break;
}
if (ret > 0) {
write_channel((uint8_t*)&m_buffer[0], ret);
}
}
return 0;
}
int write_source(void *data, size_t size) {
return ::send(m_fd[0], (char*)data, size, 0);
}
int read_source(void *data, size_t size) {
return ::recv(m_fd[0], (char*)data, size, 0);
}
int write_sink(void *data, size_t size) {
return ::send(m_fd[1], (char*)data, size, 0);
}
int read_sink(void *data, size_t size) {
return ::recv(m_fd[1], (char*)data, size, 0);
}
int write_channel(void *data, size_t size) {
webrtc::DataBuffer buffer(rtc::CopyOnWriteBuffer((uint8_t*)data, size), true);
return m_channel->Send(buffer) ? size : -1;
}
SOCKET get_source_handle() {
return m_fd[0];
}
SOCKET get_sink_handle() {
return m_fd[1];
}
DataChannelSocket *m_wrapper;
rtc::scoped_refptr<webrtc::DataChannelInterface> m_channel;
std::string m_buffer;
SOCKET m_fd[2];
uint64_t m_handle;
};
DataChannelSocket::DataChannelSocket(rtc::scoped_refptr<webrtc::DataChannelInterface> &channel) {
m_impl = new _impl_t(this, channel);
}
DataChannelSocket::~DataChannelSocket() {
delete m_impl;
}
void DataChannelSocket::OnStateChange() {
}
void DataChannelSocket::OnMessage(const webrtc::DataBuffer &buffer) {
if (!running()) {
return;
}
if (buffer.size() <= 0) {
return;
}
uint8_t *data = (uint8_t*)buffer.data.data();
size_t size = buffer.size();
m_impl->write_sink(data, size);
}
int DataChannelSocket::on_start() {
m_impl->start();
return DataChannel::on_start();
}
int DataChannelSocket::on_stop() {
m_impl->stop();
return DataChannel::on_stop();
}
int DataChannelSocket::run() {
return m_impl->transfer();
}
int DataChannelSocket::send(void *data, size_t size) {
webrtc::DataBuffer buffer(rtc::CopyOnWriteBuffer((uint8_t*)data, size), true);
return Send(buffer) ? size : -1;
}
int DataChannelSocket::recv(void *data, size_t size) {
return m_impl->read_source(data, size);
}
SOCKET DataChannelSocket::get_source_handle() {
return m_impl->get_source_handle();
}