ResponseCode Shadow::PerformUpdateAsync()

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;
    }