11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
14#include <initializer_list>
24PROMEKI_NAMESPACE_BEGIN
76 using List = promeki::List<Amf0Value>;
79 using Field = promeki::Pair<promeki::String, Amf0Value>;
82 using FieldList = promeki::List<Field>;
109 enum Marker : uint8_t {
111 MarkerBoolean = 0x01,
114 MarkerMovieClip = 0x04,
116 MarkerUndefined = 0x06,
117 MarkerReference = 0x07,
118 MarkerEcmaArray = 0x08,
119 MarkerObjectEnd = 0x09,
120 MarkerStrictArray = 0x0A,
122 MarkerLongString = 0x0C,
123 MarkerUnsupported = 0x0D,
124 MarkerRecordSet = 0x0E,
125 MarkerXmlDocument = 0x0F,
126 MarkerTypedObject = 0x10,
127 MarkerAvmPlusObject = 0x11
139 Amf0Value(int64_t i);
141 Amf0Value(
const promeki::String &s);
143 Amf0Value(
const char *s);
146 Amf0Value(
const Amf0Value &);
148 Amf0Value(Amf0Value &&) noexcept;
150 Amf0Value &operator=(const Amf0Value &);
152 Amf0Value &operator=(Amf0Value &&) noexcept;
165 static Amf0Value undefined();
168 static Amf0Value unsupported();
171 static Amf0Value reference(uint16_t index);
174 static Amf0Value
object(std::initializer_list<Field> kv = {});
183 static Amf0Value ecmaArray(std::initializer_list<Field> kv = {}, uint32_t countHint = 0);
186 static Amf0Value strictArray(std::initializer_list<Amf0Value> items = {});
194 static Amf0Value date(
double msSinceEpoch, int16_t timezone = 0);
197 static Amf0Value xmlDocument(
const promeki::String &xml);
200 static Amf0Value typedObject(
const promeki::String &className,
201 std::initializer_list<Field> kv = {});
207 bool isNull()
const {
return type() == Null; }
209 bool isUndefined()
const {
return type() == Undefined; }
211 bool isBoolean()
const {
return type() == Boolean; }
213 bool isNumber()
const {
return type() == Number; }
215 bool isString()
const {
return type() == String; }
217 bool isObject()
const {
return type() == Object; }
219 bool isEcmaArray()
const {
return type() == EcmaArray; }
221 bool isStrictArray()
const {
return type() == StrictArray; }
223 bool isDate()
const {
return type() == Date; }
225 bool isXmlDocument()
const {
return type() == XmlDocument; }
227 bool isTypedObject()
const {
return type() == TypedObject; }
229 bool isReference()
const {
return type() == Reference; }
231 bool isUnsupportedMarker()
const {
return type() == Unsupported; }
234 bool asBool(
bool def =
false)
const;
236 double asNumber(
double def = 0.0)
const;
238 promeki::String asString(
const promeki::String &def = promeki::String())
const;
241 double dateMs()
const;
243 int16_t dateTimezone()
const;
246 uint16_t referenceIndex()
const;
249 const promeki::String &className()
const;
257 const FieldList &fields()
const;
274 const Amf0Value *find(
const promeki::String &key)
const;
280 Amf0Value *find(
const promeki::String &key);
283 bool contains(
const promeki::String &key)
const;
292 void setField(
const promeki::String &key, Amf0Value value);
295 uint32_t ecmaCountHint()
const;
298 void setEcmaCountHint(uint32_t count);
301 const List &items()
const;
319 Error serialize(Buffer &out)
const;
322 promeki::String toDebugString(
unsigned int indent = 0)
const;
325 bool operator==(
const Amf0Value &other)
const;
327 bool operator!=(
const Amf0Value &other)
const {
return !(*
this == other); }
331 SharedPtr<Amf0Data> _d;
336 explicit Amf0Value(SharedPtr<Amf0Data> d);
360 static Result<Amf0Value::List> read(
const BufferView &view);
372 static Result<Amf0Value::List> read(
const uint8_t *data,
size_t len);
382 static Error readOne(
const uint8_t *data,
size_t len,
size_t &offset, Amf0Value &out);
409 explicit Amf0Writer(Buffer &out);
412 Error writeNumber(
double v);
414 Error writeBoolean(
bool v);
418 Error writeString(
const promeki::String &s);
422 Error writeUndefined();
424 Error writeDate(
double msSinceEpoch, int16_t timezone = 0);
426 Error writeStrictArray(
const Amf0Value::List &items);
428 Error writeObject(
const Amf0Value::FieldList &fields);
430 Error writeEcmaArray(
const Amf0Value::FieldList &fields, uint32_t countHint = 0);
432 Error writeTypedObject(
const promeki::String &className,
433 const Amf0Value::FieldList &fields);
435 Error writeXmlDocument(
const promeki::String &xml);
437 Error writeValue(
const Amf0Value &v);
440 size_t bytesWritten()
const {
return _bytesWritten; }
444 size_t _bytesWritten = 0;
446 Error appendBytes(
const void *bytes,
size_t len);
447 Error appendByte(uint8_t b);
448 Error appendU16BE(uint16_t v);
449 Error appendU32BE(uint32_t v);
450 Error appendDoubleBE(
double v);
451 Error appendShortString(
const promeki::String &s);
452 Error appendLongString(
const promeki::String &s);