void Client::SendEmptyMessage(const Ip6::Address &aAddress, uint16_t aPort, uint16_t aMessageId, Header::Type aType) { Header header; Ip6::MessageInfo messageInfo; Message *message; ThreadError error = kThreadError_None; header.Init(aType, kCoapCodeEmpty); header.SetMessageId(aMessageId); VerifyOrExit((message = NewMessage(header)) != NULL, ;);
ThreadError Client::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo, otCoapResponseHandler aHandler, void *aContext) { ThreadError error; Header header; RequestMetadata requestMetadata; Message *storedCopy = NULL; uint16_t copyLength = 0; SuccessOrExit(error = header.FromMessage(aMessage)); // Set Message Id if it was not already set. if (header.GetMessageId() == 0) { header.SetMessageId(mMessageId++); aMessage.Write(0, Header::kMinHeaderLength, header.GetBytes()); } if (header.IsConfirmable()) { // Create a copy of entire message and enqueue it. copyLength = aMessage.GetLength(); } else if (header.IsNonConfirmable() && header.IsRequest() && (aHandler != NULL)) { // As we do not retransmit non confirmable messages, create a copy of header only, for token information. copyLength = header.GetLength(); } if (copyLength > 0) { requestMetadata = RequestMetadata(header.IsConfirmable(), aMessageInfo, aHandler, aContext); VerifyOrExit((storedCopy = CopyAndEnqueueMessage(aMessage, copyLength, requestMetadata)) != NULL, error = kThreadError_NoBufs); } SuccessOrExit(error = mSocket.SendTo(aMessage, aMessageInfo)); exit: if (error != kThreadError_None && storedCopy != NULL) { DequeueMessage(*storedCopy); } return error; }