| 172 | } |
| 173 | |
| 174 | bool AMFReader::writeOne(UInt8 type, DataWriter& writer) { |
| 175 | |
| 176 | switch (type) { |
| 177 | |
| 178 | case AMF0_REF: { |
| 179 | packet.next(); |
| 180 | UInt16 reference = packet.read16(); |
| 181 | if(reference>=_amf0References.size()) { |
| 182 | ERROR("AMF0 reference not found") |
| 183 | return false; |
| 184 | } |
| 185 | if (writeReference(writer, (reference+1) << 1)) |
| 186 | return true; |
| 187 | UInt32 reset(packet.position()); |
| 188 | packet.reset(_amf0References[reference]); |
| 189 | bool referencing(_referencing); |
| 190 | _referencing = false; |
| 191 | bool written = readNext(writer); |
| 192 | _referencing = referencing; |
| 193 | packet.reset(reset); |
| 194 | return written; |
| 195 | } |
| 196 | |
| 197 | case STRING: { |
| 198 | type = packet.read8(); |
| 199 | UInt32 size(0); |
| 200 | if (type == AMF_LONG_STRING) { |
| 201 | size = packet.read32(); |
| 202 | if (size > packet.available()) { |
| 203 | ERROR("AMF long string bad-formed with a ", size, " size exceeding the ", packet.available(), " bytes available"); |
| 204 | return false; |
| 205 | } |
| 206 | writer.writeString(STR packet.current(), size); |
| 207 | packet.next(size); |
| 208 | return true; |
| 209 | } |
| 210 | const char* value(readText(size)); |
| 211 | if (!value) |
| 212 | return false; |
| 213 | writer.writeString(value, size); |
| 214 | return true; |
| 215 | } |
| 216 | |
| 217 | case BOOLEAN: |
| 218 | type = packet.read8(); |
| 219 | writer.writeBoolean(_amf3 ? (type == AMF3_TRUE) : packet.read8()!=0x00); |
| 220 | return true; |
| 221 | |
| 222 | case NUMBER: { |
| 223 | type = packet.read8(); |
| 224 | if (!_amf3 || type==AMF3_NUMBER) { |
| 225 | writer.writeNumber(packet.readNumber<double>()); |
| 226 | return true; |
| 227 | } |
| 228 | // Forced in AMF3 here! |
| 229 | UInt32 value = packet.read7BitValue(); |
| 230 | if(value>AMF_MAX_INTEGER) |
| 231 | value-=(1<<29); |
nothing calls this directly
no test coverage detected