| package ndr |
| |
| import ( |
| "fmt" |
| "reflect" |
| ) |
| |
| const ( |
| subStringArrayTag = `ndr:"varying,X-subStringArray"` |
| subStringArrayValue = "X-subStringArray" |
| ) |
| |
| func uint16SliceToString(a []uint16) string { |
| s := make([]rune, len(a), len(a)) |
| for i := range s { |
| s[i] = rune(a[i]) |
| } |
| if len(s) > 0 { |
| // Remove any null terminator |
| if s[len(s)-1] == rune(0) { |
| s = s[:len(s)-1] |
| } |
| } |
| return string(s) |
| } |
| |
| func (dec *Decoder) readVaryingString(def *[]deferedPtr) (string, error) { |
| a := new([]uint16) |
| v := reflect.ValueOf(a) |
| var t reflect.StructTag |
| err := dec.fillUniDimensionalVaryingArray(v.Elem(), t, def) |
| if err != nil { |
| return "", err |
| } |
| s := uint16SliceToString(*a) |
| return s, nil |
| } |
| |
| func (dec *Decoder) readConformantVaryingString(def *[]deferedPtr) (string, error) { |
| a := new([]uint16) |
| v := reflect.ValueOf(a) |
| var t reflect.StructTag |
| err := dec.fillUniDimensionalConformantVaryingArray(v.Elem(), t, def) |
| if err != nil { |
| return "", err |
| } |
| s := uint16SliceToString(*a) |
| return s, nil |
| } |
| |
| func (dec *Decoder) readStringsArray(v reflect.Value, tag reflect.StructTag, def *[]deferedPtr) error { |
| d, _ := sliceDimensions(v.Type()) |
| ndrTag := parseTags(tag) |
| var m []int |
| //var ms int |
| if ndrTag.HasValue(TagConformant) { |
| for i := 0; i < d; i++ { |
| m = append(m, int(dec.precedingMax())) |
| } |
| //common max size |
| _ = dec.precedingMax() |
| //ms = int(n) |
| } |
| tag = reflect.StructTag(subStringArrayTag) |
| err := dec.fillVaryingArray(v, tag, def) |
| if err != nil { |
| return fmt.Errorf("could not read string array: %v", err) |
| } |
| return nil |
| } |