10 "hash/crc32" |
10 "hash/crc32" |
11 "math" |
11 "math" |
12 "reflect" |
12 "reflect" |
13 |
13 |
14 "google.golang.org/protobuf/internal/errors" |
14 "google.golang.org/protobuf/internal/errors" |
15 pref "google.golang.org/protobuf/reflect/protoreflect" |
15 "google.golang.org/protobuf/reflect/protoreflect" |
16 piface "google.golang.org/protobuf/runtime/protoiface" |
16 "google.golang.org/protobuf/runtime/protoiface" |
17 ) |
17 ) |
18 |
18 |
19 // These functions exist to support exported APIs in generated protobufs. |
19 // These functions exist to support exported APIs in generated protobufs. |
20 // While these are deprecated, they cannot be removed for compatibility reasons. |
20 // While these are deprecated, they cannot be removed for compatibility reasons. |
21 |
21 |
22 // LegacyEnumName returns the name of enums used in legacy code. |
22 // LegacyEnumName returns the name of enums used in legacy code. |
23 func (Export) LegacyEnumName(ed pref.EnumDescriptor) string { |
23 func (Export) LegacyEnumName(ed protoreflect.EnumDescriptor) string { |
24 return legacyEnumName(ed) |
24 return legacyEnumName(ed) |
25 } |
25 } |
26 |
26 |
27 // LegacyMessageTypeOf returns the protoreflect.MessageType for m, |
27 // LegacyMessageTypeOf returns the protoreflect.MessageType for m, |
28 // with name used as the message name if necessary. |
28 // with name used as the message name if necessary. |
29 func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.MessageType { |
29 func (Export) LegacyMessageTypeOf(m protoiface.MessageV1, name protoreflect.FullName) protoreflect.MessageType { |
30 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
30 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
31 return mv.ProtoReflect().Type() |
31 return mv.ProtoReflect().Type() |
32 } |
32 } |
33 return legacyLoadMessageType(reflect.TypeOf(m), name) |
33 return legacyLoadMessageType(reflect.TypeOf(m), name) |
34 } |
34 } |
35 |
35 |
36 // UnmarshalJSONEnum unmarshals an enum from a JSON-encoded input. |
36 // UnmarshalJSONEnum unmarshals an enum from a JSON-encoded input. |
37 // The input can either be a string representing the enum value by name, |
37 // The input can either be a string representing the enum value by name, |
38 // or a number representing the enum number itself. |
38 // or a number representing the enum number itself. |
39 func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumber, error) { |
39 func (Export) UnmarshalJSONEnum(ed protoreflect.EnumDescriptor, b []byte) (protoreflect.EnumNumber, error) { |
40 if b[0] == '"' { |
40 if b[0] == '"' { |
41 var name pref.Name |
41 var name protoreflect.Name |
42 if err := json.Unmarshal(b, &name); err != nil { |
42 if err := json.Unmarshal(b, &name); err != nil { |
43 return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) |
43 return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) |
44 } |
44 } |
45 ev := ed.Values().ByName(name) |
45 ev := ed.Values().ByName(name) |
46 if ev == nil { |
46 if ev == nil { |
47 return 0, errors.New("invalid value for enum %v: %s", ed.FullName(), name) |
47 return 0, errors.New("invalid value for enum %v: %s", ed.FullName(), name) |
48 } |
48 } |
49 return ev.Number(), nil |
49 return ev.Number(), nil |
50 } else { |
50 } else { |
51 var num pref.EnumNumber |
51 var num protoreflect.EnumNumber |
52 if err := json.Unmarshal(b, &num); err != nil { |
52 if err := json.Unmarshal(b, &num); err != nil { |
53 return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) |
53 return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) |
54 } |
54 } |
55 return num, nil |
55 return num, nil |
56 } |
56 } |
79 blockSize := maxBlockSize |
79 blockSize := maxBlockSize |
80 if blockSize > len(in) { |
80 if blockSize > len(in) { |
81 blockHeader[0] = 0x01 // final bit per RFC 1951, section 3.2.3. |
81 blockHeader[0] = 0x01 // final bit per RFC 1951, section 3.2.3. |
82 blockSize = len(in) |
82 blockSize = len(in) |
83 } |
83 } |
84 binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)^0x0000) |
84 binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)) |
85 binary.LittleEndian.PutUint16(blockHeader[3:5], uint16(blockSize)^0xffff) |
85 binary.LittleEndian.PutUint16(blockHeader[3:5], ^uint16(blockSize)) |
86 out = append(out, blockHeader[:]...) |
86 out = append(out, blockHeader[:]...) |
87 out = append(out, in[:blockSize]...) |
87 out = append(out, in[:blockSize]...) |
88 in = in[blockSize:] |
88 in = in[blockSize:] |
89 } |
89 } |
90 out = append(out, gzipFooter[:]...) |
90 out = append(out, gzipFooter[:]...) |