OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "webrtc/base/bytebuffer.h" | 29 #include "webrtc/base/bytebuffer.h" |
30 #include "webrtc/base/common.h" | 30 #include "webrtc/base/common.h" |
31 #include "webrtc/base/httpcommon.h" | 31 #include "webrtc/base/httpcommon.h" |
32 #include "webrtc/base/logging.h" | 32 #include "webrtc/base/logging.h" |
33 #include "webrtc/base/socketadapters.h" | 33 #include "webrtc/base/socketadapters.h" |
34 #include "webrtc/base/stringencode.h" | 34 #include "webrtc/base/stringencode.h" |
35 #include "webrtc/base/stringutils.h" | 35 #include "webrtc/base/stringutils.h" |
36 | 36 |
37 #if defined(WEBRTC_WIN) | 37 #if defined(WEBRTC_WIN) |
38 #include "webrtc/base/sec_buffer.h" | 38 #include "webrtc/base/sec_buffer.h" |
39 #endif // WEBRTC_WIN | 39 #endif // WEBRTC_WIN |
40 | 40 |
41 namespace rtc { | 41 namespace rtc { |
42 | 42 |
43 BufferedReadAdapter::BufferedReadAdapter(AsyncSocket* socket, size_t size) | 43 BufferedReadAdapter::BufferedReadAdapter(AsyncSocket* socket, size_t size) |
44 : AsyncSocketAdapter(socket), buffer_size_(size), | 44 : AsyncSocketAdapter(socket), buffer_size_(size), |
45 data_len_(0), buffering_(false) { | 45 data_len_(0), buffering_(false) { |
46 buffer_ = new char[buffer_size_]; | 46 buffer_ = new char[buffer_size_]; |
47 } | 47 } |
48 | 48 |
49 BufferedReadAdapter::~BufferedReadAdapter() { | 49 BufferedReadAdapter::~BufferedReadAdapter() { |
50 delete [] buffer_; | 50 delete [] buffer_; |
51 } | 51 } |
52 | 52 |
53 int BufferedReadAdapter::Send(const void *pv, size_t cb) { | 53 int BufferedReadAdapter::Send(const void *pv, size_t cb) { |
54 if (buffering_) { | 54 if (buffering_) { |
55 // TODO: Spoof error better; Signal Writeable | 55 // TODO: Spoof error better; Signal Writeable |
56 socket_->SetError(EWOULDBLOCK); | 56 socket_->SetError(EWOULDBLOCK); |
57 return -1; | 57 return -1; |
58 } | 58 } |
59 return AsyncSocketAdapter::Send(pv, cb); | 59 return AsyncSocketAdapter::Send(pv, cb); |
60 } | 60 } |
61 | 61 |
62 int BufferedReadAdapter::Recv(void *pv, size_t cb) { | 62 int BufferedReadAdapter::Recv(void* pv, size_t cb, int64_t* timestamp) { |
63 if (buffering_) { | 63 if (buffering_) { |
64 socket_->SetError(EWOULDBLOCK); | 64 socket_->SetError(EWOULDBLOCK); |
65 return -1; | 65 return -1; |
66 } | 66 } |
67 | 67 |
68 size_t read = 0; | 68 size_t read = 0; |
69 | 69 |
70 if (data_len_) { | 70 if (data_len_) { |
71 read = std::min(cb, data_len_); | 71 read = std::min(cb, data_len_); |
72 memcpy(pv, buffer_, read); | 72 memcpy(pv, buffer_, read); |
73 data_len_ -= read; | 73 data_len_ -= read; |
74 if (data_len_ > 0) { | 74 if (data_len_ > 0) { |
75 memmove(buffer_, buffer_ + read, data_len_); | 75 memmove(buffer_, buffer_ + read, data_len_); |
76 } | 76 } |
77 pv = static_cast<char *>(pv) + read; | 77 pv = static_cast<char *>(pv) + read; |
78 cb -= read; | 78 cb -= read; |
79 } | 79 } |
80 | 80 |
81 // FIX: If cb == 0, we won't generate another read event | 81 // FIX: If cb == 0, we won't generate another read event |
82 | 82 |
83 int res = AsyncSocketAdapter::Recv(pv, cb); | 83 int res = AsyncSocketAdapter::Recv(pv, cb, timestamp); |
84 if (res >= 0) { | 84 if (res >= 0) { |
85 // Read from socket and possibly buffer; return combined length | 85 // Read from socket and possibly buffer; return combined length |
86 return res + static_cast<int>(read); | 86 return res + static_cast<int>(read); |
87 } | 87 } |
88 | 88 |
89 if (read > 0) { | 89 if (read > 0) { |
90 // Failed to read from socket, but still read something from buffer | 90 // Failed to read from socket, but still read something from buffer |
91 return static_cast<int>(read); | 91 return static_cast<int>(read); |
92 } | 92 } |
93 | 93 |
(...skipping 12 matching lines...) Expand all Loading... |
106 AsyncSocketAdapter::OnReadEvent(socket); | 106 AsyncSocketAdapter::OnReadEvent(socket); |
107 return; | 107 return; |
108 } | 108 } |
109 | 109 |
110 if (data_len_ >= buffer_size_) { | 110 if (data_len_ >= buffer_size_) { |
111 LOG(INFO) << "Input buffer overflow"; | 111 LOG(INFO) << "Input buffer overflow"; |
112 ASSERT(false); | 112 ASSERT(false); |
113 data_len_ = 0; | 113 data_len_ = 0; |
114 } | 114 } |
115 | 115 |
116 int len = socket_->Recv(buffer_ + data_len_, buffer_size_ - data_len_); | 116 int64_t timestamp; |
| 117 int len = |
| 118 socket_->Recv(buffer_ + data_len_, buffer_size_ - data_len_, ×tamp); |
117 if (len < 0) { | 119 if (len < 0) { |
118 // TODO: Do something better like forwarding the error to the user. | 120 // TODO: Do something better like forwarding the error to the user. |
119 LOG_ERR(INFO) << "Recv"; | 121 LOG_ERR(INFO) << "Recv"; |
120 return; | 122 return; |
121 } | 123 } |
122 | 124 |
123 data_len_ += len; | 125 data_len_ += len; |
124 | 126 |
125 ProcessInput(buffer_, &data_len_); | 127 ProcessInput(buffer_, &data_len_); |
126 } | 128 } |
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 } | 869 } |
868 | 870 |
869 int LoggingSocketAdapter::SendTo(const void *pv, size_t cb, | 871 int LoggingSocketAdapter::SendTo(const void *pv, size_t cb, |
870 const SocketAddress& addr) { | 872 const SocketAddress& addr) { |
871 int res = AsyncSocketAdapter::SendTo(pv, cb, addr); | 873 int res = AsyncSocketAdapter::SendTo(pv, cb, addr); |
872 if (res > 0) | 874 if (res > 0) |
873 LogMultiline(level_, label_.c_str(), false, pv, res, hex_mode_, &lms_); | 875 LogMultiline(level_, label_.c_str(), false, pv, res, hex_mode_, &lms_); |
874 return res; | 876 return res; |
875 } | 877 } |
876 | 878 |
877 int LoggingSocketAdapter::Recv(void *pv, size_t cb) { | 879 int LoggingSocketAdapter::Recv(void* pv, size_t cb, int64_t* timestamp) { |
878 int res = AsyncSocketAdapter::Recv(pv, cb); | 880 int res = AsyncSocketAdapter::Recv(pv, cb, timestamp); |
879 if (res > 0) | 881 if (res > 0) |
880 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_); | 882 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_); |
881 return res; | 883 return res; |
882 } | 884 } |
883 | 885 |
884 int LoggingSocketAdapter::RecvFrom(void *pv, size_t cb, SocketAddress *paddr) { | 886 int LoggingSocketAdapter::RecvFrom(void* pv, |
885 int res = AsyncSocketAdapter::RecvFrom(pv, cb, paddr); | 887 size_t cb, |
| 888 SocketAddress* paddr, |
| 889 int64_t* timestamp) { |
| 890 int res = AsyncSocketAdapter::RecvFrom(pv, cb, paddr, timestamp); |
886 if (res > 0) | 891 if (res > 0) |
887 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_); | 892 LogMultiline(level_, label_.c_str(), true, pv, res, hex_mode_, &lms_); |
888 return res; | 893 return res; |
889 } | 894 } |
890 | 895 |
891 int LoggingSocketAdapter::Close() { | 896 int LoggingSocketAdapter::Close() { |
892 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_); | 897 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_); |
893 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_); | 898 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_); |
894 LOG_V(level_) << label_ << " Closed locally"; | 899 LOG_V(level_) << label_ << " Closed locally"; |
895 return socket_->Close(); | 900 return socket_->Close(); |
896 } | 901 } |
897 | 902 |
898 void LoggingSocketAdapter::OnConnectEvent(AsyncSocket * socket) { | 903 void LoggingSocketAdapter::OnConnectEvent(AsyncSocket * socket) { |
899 LOG_V(level_) << label_ << " Connected"; | 904 LOG_V(level_) << label_ << " Connected"; |
900 AsyncSocketAdapter::OnConnectEvent(socket); | 905 AsyncSocketAdapter::OnConnectEvent(socket); |
901 } | 906 } |
902 | 907 |
903 void LoggingSocketAdapter::OnCloseEvent(AsyncSocket * socket, int err) { | 908 void LoggingSocketAdapter::OnCloseEvent(AsyncSocket * socket, int err) { |
904 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_); | 909 LogMultiline(level_, label_.c_str(), false, NULL, 0, hex_mode_, &lms_); |
905 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_); | 910 LogMultiline(level_, label_.c_str(), true, NULL, 0, hex_mode_, &lms_); |
906 LOG_V(level_) << label_ << " Closed with error: " << err; | 911 LOG_V(level_) << label_ << " Closed with error: " << err; |
907 AsyncSocketAdapter::OnCloseEvent(socket, err); | 912 AsyncSocketAdapter::OnCloseEvent(socket, err); |
908 } | 913 } |
909 | 914 |
910 /////////////////////////////////////////////////////////////////////////////// | 915 /////////////////////////////////////////////////////////////////////////////// |
911 | 916 |
912 } // namespace rtc | 917 } // namespace rtc |
OLD | NEW |