github.com/cnotch/ipchub@v1.1.0/av/format/amf/any.go (about)

     1  // Copyright (c) 2019,CAOHONGJU All rights reserved.
     2  // Use of this source code is governed by a MIT-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package amf
     6  
     7  import (
     8  	"fmt"
     9  	"io"
    10  	"reflect"
    11  	"time"
    12  )
    13  
    14  // Amf0 类型常量
    15  const (
    16  	TypeNumber            = 0x00
    17  	TypeBoolean           = 0x01
    18  	TypeString            = 0x02
    19  	TypeObject            = 0x03
    20  	TypeMovieClip         = 0x04 //reserved, not supported
    21  	TypeNull              = 0x05
    22  	TypeUndefined         = 0x06
    23  	TypeReference         = 0x07
    24  	TypeEcmaArray         = 0x08
    25  	TypeObjectEnd         = 0x09
    26  	TypeStrictArray       = 0x0A
    27  	TypeDate              = 0x0B
    28  	TypeLongString        = 0x0C
    29  	TypeUnSupported       = 0x0D
    30  	TypeRecordSet         = 0x0E
    31  	TypeXMLDocument       = 0x0F
    32  	TypeTypedObject       = 0x10
    33  	TypeAVMplusObject     = 0x11
    34  	TypeOriginStrictArray = 0x20
    35  	TypeInvalid           = 0x3F
    36  )
    37  
    38  // UndefinedValue  表示 TypeUndefined 类型存储的值
    39  type UndefinedValue struct{}
    40  
    41  // UnSupportedValue 表示 TypeUnSupported 类型存储的值
    42  type UnSupportedValue struct{}
    43  
    44  // objectEndValue 表示 TypeObjectEnd 存储的值
    45  type objectEndValue struct{}
    46  
    47  // ReadAny .
    48  func ReadAny(r io.Reader) (value interface{}, err error) {
    49  	var buff [1]byte
    50  	if _, err = io.ReadFull(r, buff[:]); err != nil {
    51  		return
    52  	}
    53  
    54  	marker := buff[0]
    55  	switch marker {
    56  	case TypeNumber:
    57  		value, err = readNumber(r)
    58  	case TypeBoolean:
    59  		value, err = readBool(r)
    60  	case TypeString:
    61  		value, err = readUtf8(r, 2)
    62  	case TypeObject:
    63  		value, err = readObject(r)
    64  	case TypeNull:
    65  		value = nil
    66  	case TypeUndefined:
    67  		value = UndefinedValue{}
    68  	case TypeEcmaArray:
    69  		value, err = readEcmaArray(r)
    70  	case TypeObjectEnd:
    71  		value = objectEndValue{}
    72  	case TypeStrictArray:
    73  		value, err = readStrictArray(r)
    74  	case TypeDate:
    75  		value, err = readDate(r)
    76  	case TypeLongString:
    77  		value, err = readUtf8(r, 4)
    78  	case TypeUnSupported:
    79  		value = UnSupportedValue{}
    80  	default:
    81  		err = fmt.Errorf("Amf0ReadAny: unsupported marker - %d", marker)
    82  	}
    83  	return
    84  }
    85  
    86  // WriteAny .
    87  func WriteAny(w io.Writer, any interface{}) (err error) {
    88  	if any == nil {
    89  		err = writeType(w, TypeNull)
    90  		return
    91  	}
    92  
    93  	switch v := any.(type) {
    94  	case *string:
    95  		if len(*v) > 65535 {
    96  			err = WriteLongString(w, *v)
    97  		} else {
    98  			err = WriteString(w, *v)
    99  		}
   100  	case string:
   101  		if len(v) > 65535 {
   102  			err = WriteLongString(w, v)
   103  		} else {
   104  			err = WriteString(w, v)
   105  		}
   106  	case *bool:
   107  		err = WriteBool(w, *v)
   108  	case bool:
   109  		err = WriteBool(w, v)
   110  	case *int:
   111  		err = WriteNumber(w, float64(*v))
   112  	case int:
   113  		err = WriteNumber(w, float64(v))
   114  	case *int8:
   115  		err = WriteNumber(w, float64(*v))
   116  	case int8:
   117  		err = WriteNumber(w, float64(v))
   118  	case *int16:
   119  		err = WriteNumber(w, float64(*v))
   120  	case int16:
   121  		err = WriteNumber(w, float64(v))
   122  	case *int32:
   123  		err = WriteNumber(w, float64(*v))
   124  	case int32:
   125  		err = WriteNumber(w, float64(v))
   126  	case *int64:
   127  		err = WriteNumber(w, float64(*v))
   128  	case int64:
   129  		err = WriteNumber(w, float64(v))
   130  	case *uint:
   131  		err = WriteNumber(w, float64(*v))
   132  	case uint:
   133  		err = WriteNumber(w, float64(v))
   134  	case *uint8:
   135  		err = WriteNumber(w, float64(*v))
   136  	case uint8:
   137  		err = WriteNumber(w, float64(v))
   138  	case *uint16:
   139  		err = WriteNumber(w, float64(*v))
   140  	case uint16:
   141  		err = WriteNumber(w, float64(v))
   142  	case *uint32:
   143  		err = WriteNumber(w, float64(*v))
   144  	case uint32:
   145  		err = WriteNumber(w, float64(v))
   146  	case *uint64:
   147  		err = WriteNumber(w, float64(*v))
   148  	case uint64:
   149  		err = WriteNumber(w, float64(v))
   150  	case *float32:
   151  		err = WriteNumber(w, float64(*v))
   152  	case float32:
   153  		err = WriteNumber(w, float64(v))
   154  	case *float64:
   155  		err = WriteNumber(w, *v)
   156  	case float64:
   157  		err = WriteNumber(w, v)
   158  	case *time.Time:
   159  		err = WriteDate(w, *v)
   160  	case time.Time:
   161  		err = WriteDate(w, v)
   162  	case *UndefinedValue:
   163  		err = writeType(w, TypeUndefined)
   164  	case UndefinedValue:
   165  		err = writeType(w, TypeUndefined)
   166  	case *EcmaArray:
   167  		err = WriteEcmaArray(w, *v)
   168  	case EcmaArray:
   169  		err = WriteEcmaArray(w, v)
   170  	case *Object:
   171  		err = WriteObject(w, *v)
   172  	case Object:
   173  		err = WriteObject(w, v)
   174  	case *StrictArray:
   175  		err = WriteStrictArray(w, *v)
   176  	case StrictArray:
   177  		err = WriteStrictArray(w, v)
   178  	default:
   179  		err = fmt.Errorf("Unsupported type : %v", reflect.TypeOf(v))
   180  	}
   181  
   182  	return
   183  }