| 148 | } |
| 149 | |
| 150 | Result DoLoadMessage(LoadContext* load_context, InputBuffer* input_buffer, |
| 151 | const Descriptor* desc, Message* message) |
| 152 | { |
| 153 | uint8_t read_fields[DDF_MAX_FIELDS]; |
| 154 | memset(read_fields, 0, sizeof(read_fields)); |
| 155 | |
| 156 | for (int i = 0; i < desc->m_FieldCount; ++i) |
| 157 | { |
| 158 | const FieldDescriptor* f = &desc->m_Fields[i]; |
| 159 | if (f->m_Label == LABEL_REPEATED) |
| 160 | { |
| 161 | // TODO: Verify buffer_pos!!!! Correct to use Tell()? |
| 162 | uint32_t buffer_pos = input_buffer->Tell(); |
| 163 | message->AllocateRepeatedBuffer(load_context, f, load_context->GetArrayCount(buffer_pos, f->m_Number)); |
| 164 | } |
| 165 | } |
| 166 | |
| 167 | while (!input_buffer->Eof()) |
| 168 | { |
| 169 | uint32_t tag; |
| 170 | if (input_buffer->ReadVarInt32(&tag)) |
| 171 | { |
| 172 | uint32_t key = tag >> 3; |
| 173 | uint32_t type = tag & 0x7; |
| 174 | |
| 175 | if (key == 0) |
| 176 | { |
| 177 | return RESULT_WIRE_FORMAT_ERROR; |
| 178 | } |
| 179 | |
| 180 | uint32_t field_index; |
| 181 | const FieldDescriptor* field = FindField(desc, key, &field_index); |
| 182 | |
| 183 | if (!field) |
| 184 | { |
| 185 | // TODO: FIELD NOT FOUND. HOW TO HANDLE?!?! |
| 186 | Result e = SkipField(input_buffer, type); |
| 187 | if (e != RESULT_OK) |
| 188 | { |
| 189 | return e; |
| 190 | } |
| 191 | continue; |
| 192 | } |
| 193 | else |
| 194 | { |
| 195 | assert(field_index < DDF_MAX_FIELDS); |
| 196 | read_fields[field_index] = 1; |
| 197 | |
| 198 | Result e; |
| 199 | e = message->ReadField(load_context, (WireType) type, field, input_buffer); |
| 200 | if (e != RESULT_OK) |
| 201 | { |
| 202 | return e; |
| 203 | } |
| 204 | |
| 205 | if (field->m_OneOfIndex != DDF_NO_ONE_OF_INDEX) |
| 206 | { |
| 207 | message->SetOneOf(desc, field); |
no test coverage detected