00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "fltRecordWriter.h"
00016 #include "fltInstanceDefinition.h"
00017 #include "fltHeader.h"
00018 #include "config_flt.h"
00019
00020 #include "datagram.h"
00021
00022 #include <assert.h>
00023
00024
00025
00026
00027 static const int max_write_length = 65532;
00028
00029
00030
00031
00032
00033
00034 FltRecordWriter::
00035 FltRecordWriter(ostream &out) :
00036 _out(out)
00037 {
00038 }
00039
00040
00041
00042
00043
00044
00045 FltRecordWriter::
00046 ~FltRecordWriter() {
00047 }
00048
00049
00050
00051
00052
00053
00054 void FltRecordWriter::
00055 set_opcode(FltOpcode opcode) {
00056 _opcode = opcode;
00057 }
00058
00059
00060
00061
00062
00063
00064
00065 void FltRecordWriter::
00066 set_datagram(const Datagram &datagram) {
00067 _datagram = datagram;
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 Datagram &FltRecordWriter::
00080 update_datagram() {
00081 return _datagram;
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091 FltError FltRecordWriter::
00092 advance() {
00093 int start_byte = 0;
00094 int write_length =
00095 min((int)_datagram.get_length() - start_byte, max_write_length - header_size);
00096 FltOpcode opcode = _opcode;
00097
00098 do {
00099 if (flt_cat.is_debug()) {
00100 flt_cat.debug()
00101 << "Writing " << opcode << " of length "
00102 << write_length + header_size << "\n";
00103 }
00104
00105
00106 Datagram dg;
00107 dg.add_be_int16(opcode);
00108 dg.add_be_int16(write_length + header_size);
00109
00110 nassertr((int)dg.get_length() == header_size, FE_internal);
00111
00112 _out.write((const char *)dg.get_data(), dg.get_length());
00113 if (_out.fail()) {
00114 assert(!flt_error_abort);
00115 return FE_write_error;
00116 }
00117
00118
00119 _out.write((const char *)_datagram.get_data() + start_byte, write_length);
00120 if (_out.fail()) {
00121 assert(!flt_error_abort);
00122 return FE_write_error;
00123 }
00124
00125 start_byte += write_length;
00126 write_length =
00127 min((int)_datagram.get_length() - start_byte, max_write_length - header_size);
00128 opcode = FO_continuation;
00129 } while (write_length > 0);
00130
00131 _datagram.clear();
00132 _opcode = FO_none;
00133
00134 return FE_ok;
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144 FltError FltRecordWriter::
00145 write_record(FltOpcode opcode, const Datagram &datagram) {
00146 _opcode = opcode;
00147 _datagram = datagram;
00148 return advance();
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158 FltError FltRecordWriter::
00159 write_instance_def(FltHeader *header, int instance_index) {
00160 bool inserted = _instances_written.insert(instance_index).second;
00161
00162 if (!inserted) {
00163
00164 return FE_ok;
00165 }
00166
00167 FltInstanceDefinition *instance = header->get_instance(instance_index);
00168 if (instance == (FltInstanceDefinition *)NULL) {
00169 assert(!flt_error_abort);
00170 return FE_undefined_instance;
00171 }
00172
00173 return instance->write_record_and_children(*this);
00174 }