in src/shadow/Shadow.cpp [537:591]
ResponseCode Shadow::PerformUpdateAsync() {
if (nullptr == p_mqtt_client_) {
return ResponseCode::SHADOW_MQTT_CLIENT_NOT_SET_ERROR;
}
if (!p_mqtt_client_->IsConnected()) {
return ResponseCode::SHADOW_MQTT_DISCONNECTED_ERROR;
}
if (!cur_server_state_document_.IsObject()
|| !cur_device_state_document_.IsObject()) {
// Should never happen
AWS_LOG_ERROR(SHADOW_LOG_TAG, "Server/Device state no longer an object!! Should never Happen!!");
return ResponseCode::FAILURE;
}
if (cur_server_state_document_.HasMember(SHADOW_DOCUMENT_STATE_KEY)
&& cur_device_state_document_.HasMember(SHADOW_DOCUMENT_STATE_KEY)
&& (cur_device_state_document_[SHADOW_DOCUMENT_STATE_KEY]
== cur_server_state_document_[SHADOW_DOCUMENT_STATE_KEY])) {
return ResponseCode::SHADOW_NOTHING_TO_UPDATE;
}
ResponseCode rc = ResponseCode::SUCCESS;
if (!is_update_subscription_active_) {
util::Map<ShadowRequestType, Shadow::RequestHandlerPtr> request_mapping;
request_mapping.insert(std::make_pair(ShadowRequestType::Update, nullptr));
rc = AddShadowSubscription(request_mapping);
if (ResponseCode::SUCCESS != rc) {
return rc;
}
}
// TODO: Optimization needed here
util::JsonDocument diff;
util::JsonParser::DiffValues(diff, cur_server_state_document_, cur_device_state_document_, diff.GetAllocator());
if (diff.HasMember(SHADOW_DOCUMENT_TIMESTAMP_KEY)) {
diff.EraseMember(SHADOW_DOCUMENT_TIMESTAMP_KEY);
}
if (diff.HasMember(SHADOW_DOCUMENT_VERSION_KEY)) {
diff.EraseMember(SHADOW_DOCUMENT_VERSION_KEY);
}
// make sure that payload is valid
if (!diff.HasMember(SHADOW_DOCUMENT_STATE_KEY)) {
return ResponseCode::SHADOW_NOTHING_TO_UPDATE;
}
util::String payload = util::JsonParser::ToString(diff);
rc = p_mqtt_client_->Publish(Utf8String::Create(shadow_topic_update_), false, false, mqtt::QoS::QOS0,
payload, mqtt_command_timeout_);
return rc;
}