15 #include "socketStream.h" 17 #include "datagramIterator.h" 18 #include "httpChannel.h" 19 #include "config_downloader.h" 29 SSReader(istream *stream) : _istream(stream) {
31 _tcp_header_size = tcp_header_size;
33 #ifdef SIMULATE_NETWORK_DELAY 34 _delay_active =
false;
36 _delay_variance = 0.0;
37 #endif // SIMULATE_NETWORK_DELAY 60 if (_tcp_header_size == 0) {
61 _data_expected = _data_so_far.length();
63 if (_data_expected == 0) {
65 while ((
int)_data_so_far.length() < _tcp_header_size) {
66 int ch = _istream->get();
67 if (_istream->eof() || _istream->fail()) {
71 _data_so_far += (char)ch;
76 if (_tcp_header_size == 2) {
77 _data_expected = di.get_uint16();
78 }
else if (_tcp_header_size == 4) {
79 _data_expected = di.get_uint32();
81 _data_so_far = _data_so_far.substr(_tcp_header_size);
83 if (_data_expected == 0) {
92 static const size_t buffer_size = 1024;
93 char buffer[buffer_size];
95 size_t read_count = min(_data_expected - _data_so_far.length(),
97 _istream->read(buffer, read_count);
98 size_t count = _istream->gcount();
100 _data_so_far.append(buffer, count);
102 read_count = min(_data_expected - _data_so_far.length(),
104 _istream->read(buffer, read_count);
105 count = _istream->gcount();
108 if (_data_so_far.length() < _data_expected) {
119 _data_so_far = string();
124 #ifdef SIMULATE_NETWORK_DELAY 140 start_delay(
double min_delay,
double max_delay) {
141 _min_delay = min_delay;
142 _delay_variance = max(max_delay - min_delay, 0.0);
143 _delay_active =
true;
145 #endif // SIMULATE_NETWORK_DELAY 147 #ifdef SIMULATE_NETWORK_DELAY 157 _delay_active =
false;
159 #endif // SIMULATE_NETWORK_DELAY 161 #ifdef SIMULATE_NETWORK_DELAY 169 delay_datagram(
const Datagram &datagram) {
170 nassertv(_delay_active);
173 double reveal_time = now + _min_delay;
175 if (_delay_variance > 0.0) {
176 reveal_time += _delay_variance * ((double)rand() / (double)RAND_MAX);
178 _delayed.push_back(DelayedDatagram());
179 DelayedDatagram &dd = _delayed.back();
180 dd._reveal_time = reveal_time;
181 dd._datagram = datagram;
183 #endif // SIMULATE_NETWORK_DELAY 185 #ifdef SIMULATE_NETWORK_DELAY 195 if (_delayed.empty()) {
198 const DelayedDatagram &dd = _delayed.front();
201 if (dd._reveal_time > now) {
207 datagram = dd._datagram;
208 _delayed.pop_front();
212 #endif // SIMULATE_NETWORK_DELAY 220 SSWriter(ostream *stream) : _ostream(stream) {
221 _collect_tcp = collect_tcp;
222 _collect_tcp_interval = collect_tcp_interval;
223 _queued_data_start = 0.0;
224 _tcp_header_size = tcp_header_size;
248 if (_tcp_header_size == 2) {
250 downloader_cat.error()
251 <<
"Attempt to send TCP datagram of " << dg.
get_length()
252 <<
" bytes--too long!\n";
253 nassert_raise(
"Datagram too long");
258 }
else if (_tcp_header_size == 4) {
282 nassertv(_channel == NULL);
285 #endif // HAVE_OPENSSL static TrueClock * get_global_ptr()
Returns a pointer to the one TrueClock object in the world.
void append_data(const void *data, size_t size)
Appends some more raw data to the end of the datagram.
virtual void clear()
Resets the datagram to empty, in preparation for building up a new datagram.
void flush()
Forces out all output that hasn't yet been written.
void add_uint16(PN_uint16 value)
Adds an unsigned 16-bit integer to the datagram.
void add_uint32(PN_uint32 value)
Adds an unsigned 32-bit integer to the datagram.
A class to retrieve the individual data elements previously stored in a Datagram. ...
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
size_t get_length() const
Returns the number of bytes in the datagram.
const void * get_data() const
Returns a pointer to the beginning of the datagram's data.