| 28 | } |
| 29 | |
| 30 | Result DoSaveMessage(const void* message_, const Descriptor* desc, void* context, SaveFunction save_function) |
| 31 | { |
| 32 | OutputStream output_stream(save_function, context); |
| 33 | const uint8_t* message = (const uint8_t*) message_; |
| 34 | |
| 35 | for (int i = 0; i < desc->m_FieldCount; ++i) |
| 36 | { |
| 37 | bool write_result; |
| 38 | FieldDescriptor* field_desc = &desc->m_Fields[i]; |
| 39 | Type type = (Type) field_desc->m_Type; |
| 40 | |
| 41 | if (field_desc->m_OneOfIndex != DDF_NO_ONE_OF_INDEX) |
| 42 | { |
| 43 | // Resolve the oneof member for this field |
| 44 | assert(field_desc->m_OneOfIndex > 0); |
| 45 | uint32_t oneof_offset = desc->m_OneOfDataOffsets[field_desc->m_OneOfIndex-1]; |
| 46 | uint8_t oneof_member = message[oneof_offset]; |
| 47 | if (oneof_member != field_desc->m_Number) |
| 48 | { |
| 49 | continue; |
| 50 | } |
| 51 | } |
| 52 | |
| 53 | #define DDF_SAVEMESSAGE_CASE(t, wt, func) \ |
| 54 | write_result = output_stream.WriteTag(field_desc->m_Number, wt) && \ |
| 55 | output_stream.func(*((t*) data)); \ |
| 56 | if (!write_result)\ |
| 57 | return RESULT_IO_ERROR; \ |
| 58 | break; |
| 59 | |
| 60 | int element_size = 0; |
| 61 | if ( field_desc->m_Type == TYPE_MESSAGE ) |
| 62 | { |
| 63 | element_size = field_desc->m_MessageDescriptor->m_Size; |
| 64 | } |
| 65 | else if ( field_desc->m_Type == TYPE_STRING ) |
| 66 | { |
| 67 | element_size = sizeof(const char*); |
| 68 | } |
| 69 | else if ( field_desc->m_Type == TYPE_BYTES ) |
| 70 | { |
| 71 | element_size = sizeof(RepeatedField); |
| 72 | } |
| 73 | else |
| 74 | { |
| 75 | element_size = ScalarTypeSize(type); |
| 76 | } |
| 77 | |
| 78 | uint32_t count = 1; |
| 79 | const uint8_t* data_start = &message[field_desc->m_Offset]; |
| 80 | if (field_desc->m_Label == LABEL_REPEATED) |
| 81 | { |
| 82 | RepeatedField* repeated = (RepeatedField*) data_start; |
| 83 | count = repeated->m_ArrayCount; |
| 84 | data_start = (const uint8_t *) repeated->m_Array; |
| 85 | } |
| 86 | |
| 87 | for (uint32_t j = 0; j < count; ++j) |
no test coverage detected