Panda3D
Loading...
Searching...
No Matches
socketStreamRecorder.cxx
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 socketStreamRecorder.cxx
10 * @author drose
11 * @date 2004-01-28
12 */
13
15#include "recorderController.h"
16#include "bamReader.h"
17#include "bamWriter.h"
18
19#ifdef HAVE_OPENSSL
20
21TypeHandle SocketStreamRecorder::_type_handle;
22
23/**
24 * Receives a datagram over the socket by expecting a little-endian 16-bit
25 * byte count as a prefix. If the socket stream is non-blocking, may return
26 * false if the data is not available; otherwise, returns false only if the
27 * socket closes.
28 */
29bool SocketStreamRecorder::
30receive_datagram(Datagram &dg) {
31 if (is_playing()) {
32 // If we're playing back data, the datagrams come only from the queue, not
33 // from the live connection.
34 if (!_data.empty()) {
35 dg = _data.front();
36 _data.pop_front();
37 return true;
38 }
39
40 return false;
41
42 } else {
43 // If we're not in playback mode, forward the request to the connection.
44 bool got_data = false;
45 if (_stream != nullptr) {
46 got_data = _stream->receive_datagram(dg);
47 }
48
49 if (got_data && is_recording()) {
50 // If we're in recording mode, save the data.
51 _data.push_back(dg);
52 }
53
54 return got_data;
55 }
56}
57
58/**
59 * Records the most recent data collected into the indicated datagram, and
60 * returns true if there is any interesting data worth recording, or false if
61 * the datagram is meaningless.
62 */
63void SocketStreamRecorder::
64record_frame(BamWriter *manager, Datagram &dg) {
65 nassertv(is_recording());
66 dg.add_bool(_closed);
67 dg.add_uint16(_data.size());
68 for (Data::iterator di = _data.begin(); di != _data.end(); ++di) {
69 dg.add_string((*di).get_message());
70 }
71 _data.clear();
72}
73
74
75/**
76 * Reloads the most recent data collected from the indicated datagram.
77 */
78void SocketStreamRecorder::
79play_frame(DatagramIterator &scan, BamReader *manager) {
80 nassertv(is_playing());
81 _closed = scan.get_bool();
82
83 int num_packets = scan.get_uint16();
84 for (int i = 0; i < num_packets; i++) {
85 _data.push_back(Datagram(scan.get_blob()));
86 }
87}
88
89/**
90 * Tells the BamReader how to create objects of type Lens.
91 */
92void SocketStreamRecorder::
93register_with_read_factory() {
94 RecorderController::get_factory()->register_factory(get_class_type(), make_recorder);
95}
96
97/**
98 * Writes the contents of this object to the datagram for encoding in the
99 * session file. This is very similar to write_datagram() for TypedWritable
100 * objects, but it is used specifically to write the Recorder object when
101 * generating the session file. In many cases, it will be the same as
102 * write_datagram().
103 */
104void SocketStreamRecorder::
105write_recorder(BamWriter *manager, Datagram &dg) {
106 RecorderBase::write_recorder(manager, dg);
107}
108
109/**
110 * This is similar to make_from_bam(), but it is designed for loading the
111 * RecorderBase object from the session log created by a RecorderController.
112 */
113RecorderBase *SocketStreamRecorder::
114make_recorder(const FactoryParams &params) {
115 SocketStreamRecorder *node = new SocketStreamRecorder;
116 BamReaderParam *param = DCAST(BamReaderParam, params.get_param(0));
117
118 node->fillin_recorder((DatagramIterator &)param->get_iterator(), param->get_manager());
119
120 return node;
121}
122
123/**
124 * This internal function is called by make_from_bam to read in all of the
125 * relevant data from the BamFile for the new SocketStreamRecorder.
126 */
127void SocketStreamRecorder::
128fillin_recorder(DatagramIterator &scan, BamReader *manager) {
129 RecorderBase::fillin_recorder(scan, manager);
130}
131
132#endif // HAVE_OPENSSL
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
The parameters that are passed through the Factory to any object constructing itself from a Bam file.
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition bamReader.h:110
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition bamWriter.h:63
A class to retrieve the individual data elements previously stored in a Datagram.
uint16_t get_uint16()
Extracts an unsigned 16-bit integer.
bool get_bool()
Extracts a boolean value.
vector_uchar get_blob()
Extracts a variable-length binary blob.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition datagram.h:38
void add_bool(bool value)
Adds a boolean value to the datagram.
Definition datagram.I:34
void add_uint16(uint16_t value)
Adds an unsigned 16-bit integer to the datagram.
Definition datagram.I:85
void add_string(const std::string &str)
Adds a variable-length string to the datagram.
Definition datagram.I:219
An instance of this class is passed to the Factory when requesting it to do its business and construc...
FactoryParam * get_param(int n) const
Returns the nth parameter that has been added to the set.
void register_factory(TypeHandle handle, CreateFunc *func, void *user_data=nullptr)
Registers a new kind of thing the Factory will be able to create.
Definition factory.I:73
This is the base class to a number of objects that record particular kinds of user input (like a Mous...
virtual void write_recorder(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for encoding in the session file.
static RecorderFactory * get_factory()
Returns the global RecorderFactory for generating TypedWritable objects.
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.