Panda3D
socketStream.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file socketStream.h
10  * @author drose
11  * @date 2002-10-15
12  */
13 
14 #ifndef SOCKETSTREAM_H
15 #define SOCKETSTREAM_H
16 
17 #include "pandabase.h"
18 #include "trueClock.h"
19 #include "config_express.h" // for collect_tcp
20 #include "datagram.h"
21 #include "pdeque.h"
22 #include "typedReferenceCount.h"
23 #include "pointerTo.h"
24 #include "vector_uchar.h"
25 
26 // At the present, this module is not compiled if OpenSSL is not available,
27 // since the only current use for it is to implement OpenSSL-defined
28 // constructs (like ISocketStream).
29 
30 #ifdef HAVE_OPENSSL
31 
32 class HTTPChannel;
33 
34 /**
35  * An internal class for reading from a socket stream. This serves as a base
36  * class for both ISocketStream and SocketStream; its purpose is to minimize
37  * redundant code between them. Do not use it directly.
38  */
39 class EXPCL_PANDA_DOWNLOADER SSReader {
40 public:
41  SSReader(std::istream *stream);
42  virtual ~SSReader();
43 
44 PUBLISHED:
45  INLINE bool receive_datagram(Datagram &dg);
46 
47  virtual bool is_closed() = 0;
48  virtual void close() = 0;
49 
50  INLINE void set_tcp_header_size(int tcp_header_size);
51  INLINE int get_tcp_header_size() const;
52 
53 private:
54  bool do_receive_datagram(Datagram &dg);
55 
56  std::istream *_istream;
57  size_t _data_expected;
58  vector_uchar _data_so_far;
59  int _tcp_header_size;
60 
61 #ifdef SIMULATE_NETWORK_DELAY
62 PUBLISHED:
63  void start_delay(double min_delay, double max_delay);
64  void stop_delay();
65 
66 private:
67  void delay_datagram(const Datagram &datagram);
68  bool get_delayed(Datagram &datagram);
69 
70  class DelayedDatagram {
71  public:
72  double _reveal_time;
73  Datagram _datagram;
74  };
75 
76  typedef pdeque<DelayedDatagram> Delayed;
77  Delayed _delayed;
78  bool _delay_active;
79  double _min_delay, _delay_variance;
80 
81 #endif // SIMULATE_NETWORK_DELAY
82 };
83 
84 /**
85  * An internal class for writing to a socket stream. This serves as a base
86  * class for both OSocketStream and SocketStream; its purpose is to minimize
87  * redundant code between them. Do not use it directly.
88  */
89 class EXPCL_PANDA_DOWNLOADER SSWriter {
90 public:
91  SSWriter(std::ostream *stream);
92  virtual ~SSWriter();
93 
94 PUBLISHED:
95  bool send_datagram(const Datagram &dg);
96 
97  virtual bool is_closed() = 0;
98  virtual void close() = 0;
99 
100  INLINE void set_collect_tcp(bool collect_tcp);
101  INLINE bool get_collect_tcp() const;
102  INLINE void set_collect_tcp_interval(double interval);
103  INLINE double get_collect_tcp_interval() const;
104 
105  INLINE void set_tcp_header_size(int tcp_header_size);
106  INLINE int get_tcp_header_size() const;
107 
108  INLINE bool consider_flush();
109  INLINE bool flush();
110 
111 private:
112  std::ostream *_ostream;
113  bool _collect_tcp;
114  double _collect_tcp_interval;
115  double _queued_data_start;
116  int _tcp_header_size;
117 };
118 
119 /**
120  * This is a base class for istreams implemented in Panda that read from a
121  * (possibly non-blocking) socket. It adds is_closed(), which can be called
122  * after an eof condition to check whether the socket has been closed, or
123  * whether more data may be available later.
124  */
125 class EXPCL_PANDA_DOWNLOADER ISocketStream : public std::istream, public SSReader {
126 public:
127  INLINE ISocketStream(std::streambuf *buf);
128  virtual ~ISocketStream();
129 
130 #if _MSC_VER >= 1800
131  INLINE ISocketStream(const ISocketStream &copy) = delete;
132 #endif
133 
134 PUBLISHED:
135  enum ReadState {
136  RS_initial,
137  RS_reading,
138  RS_complete,
139  RS_error,
140  };
141 
142  virtual bool is_closed() = 0;
143  virtual void close() = 0;
144  virtual ReadState get_read_state() = 0;
145 
146 protected:
147  HTTPChannel *_channel;
148 
149 private:
150  friend class HTTPChannel;
151 };
152 
153 /**
154  * A base class for ostreams that write to a (possibly non-blocking) socket.
155  * It adds is_closed(), which can be called after any write operation fails to
156  * check whether the socket has been closed, or whether more data may be sent
157  * later.
158  */
159 class EXPCL_PANDA_DOWNLOADER OSocketStream : public std::ostream, public SSWriter {
160 public:
161  INLINE OSocketStream(std::streambuf *buf);
162 
163 #if _MSC_VER >= 1800
164  INLINE OSocketStream(const OSocketStream &copy) = delete;
165 #endif
166 
167 PUBLISHED:
168  virtual bool is_closed() = 0;
169  virtual void close() = 0;
170 
171  INLINE bool flush();
172 };
173 
174 /**
175  * A base class for iostreams that read and write to a (possibly non-blocking)
176  * socket.
177  */
178 class EXPCL_PANDA_DOWNLOADER SocketStream : public std::iostream, public SSReader, public SSWriter {
179 public:
180  INLINE SocketStream(std::streambuf *buf);
181 
182 #if _MSC_VER >= 1800
183  INLINE SocketStream(const SocketStream &copy) = delete;
184 #endif
185 
186 PUBLISHED:
187  virtual bool is_closed() = 0;
188  virtual void close() = 0;
189 
190  INLINE void set_tcp_header_size(int tcp_header_size);
191  INLINE int get_tcp_header_size() const;
192 
193  INLINE bool flush();
194 };
195 
196 
197 #include "socketStream.I"
198 
199 #endif // HAVE_OPENSSL
200 
201 
202 #endif
trueClock.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
vector_uchar.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
socketStream.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Datagram
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38
pdeque
This is our own Panda specialization on the default STL deque.
Definition: pdeque.h:36
datagram.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
typedReferenceCount.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
config_express.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pointerTo.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pdeque.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.