3 * Copyright (c) 2020 Project CHIP Authors
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 #include <system/SystemPacketBuffer.h>
22 #include <mdns/minimal/core/DnsHeader.h>
23 #include <mdns/minimal/records/ResourceRecord.h>
28 /// Writes a MDNS reply into a given packet buffer.
32 ResponseBuilder() : mHeader(nullptr) {}
33 ResponseBuilder(chip::System::PacketBufferHandle && packet) : mHeader(nullptr) { Reset(std::move(packet)); }
35 ResponseBuilder & Reset(chip::System::PacketBufferHandle && packet)
37 mPacket = std::move(packet);
38 mHeader = HeaderRef(mPacket->Start());
40 if (mPacket->AvailableDataLength() >= HeaderRef::kSizeBytes)
42 mPacket->SetDataLength(HeaderRef::kSizeBytes);
51 mHeader.SetFlags(mHeader.GetFlags().SetResponse());
56 chip::System::PacketBufferHandle ReleasePacket()
58 mHeader = HeaderRef(nullptr);
60 return std::move(mPacket);
63 bool HasResponseRecords() const
65 return (mHeader.GetAnswerCount() != 0) || (mHeader.GetAuthorityCount() != 0) || (mHeader.GetAdditionalCount() != 0);
68 HeaderRef & Header() { return mHeader; }
70 /// Attempts to add a record to the currentsystem packet buffer.
71 /// On success, the packet buffer data length is updated.
72 /// On failure, the packet buffer data length is NOT updated and header is unchanged.
73 ResponseBuilder & AddRecord(ResourceType type, const ResourceRecord & record)
80 chip::Encoding::BigEndian::BufferWriter out(mPacket->Start() + mPacket->DataLength(), mPacket->AvailableDataLength());
82 if (!record.Append(mHeader, type, out))
88 mPacket->SetDataLength(static_cast<uint16_t>(mPacket->DataLength() + out.Needed()));
93 ResponseBuilder & AddQuery(const QueryData & query)
100 chip::Encoding::BigEndian::BufferWriter out(mPacket->Start() + mPacket->DataLength(), mPacket->AvailableDataLength());
102 if (!query.Append(mHeader, out))
108 mPacket->SetDataLength(static_cast<uint16_t>(mPacket->DataLength() + out.Needed()));
113 bool Ok() const { return mBuildOk; }
114 bool HasPacketBuffer() const { return !mPacket.IsNull(); }
117 chip::System::PacketBufferHandle mPacket;
119 bool mBuildOk = false;
122 } // namespace Minimal