| // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "feedback/feedback_service_interface.h" |
| |
| #include "base/bind.h" |
| #include "base/message_loop/message_loop.h" |
| #include "chromeos/dbus/service_constants.h" |
| #include "components/feedback/feedback_common.h" |
| #include "components/feedback/proto/extension.pb.h" |
| #include "dbus/object_proxy.h" |
| |
| DBusFeedbackServiceInterface::DBusFeedbackServiceInterface() { |
| dbus::Bus::Options options; |
| options.bus_type = dbus::Bus::SYSTEM; |
| bus_ = new dbus::Bus(options); |
| } |
| |
| bool DBusFeedbackServiceInterface::SendFeedback( |
| const FeedbackCommon& feedback, |
| FeedbackResultCallback callback) { |
| // A product ID of 0 generally means that the caller just forgot to |
| // set it at all, and an empty description is apparently ignored |
| // by the feedback servers. |
| if (feedback.description().empty() || feedback.product_id() == 0) { |
| return false; |
| } |
| |
| userfeedback::ExtensionSubmit submit; |
| feedback.PrepareReport(&submit); |
| |
| dbus::MethodCall call(feedback::kFeedbackServiceName, |
| feedback::kSendFeedback); |
| |
| dbus::MessageWriter writer(&call); |
| writer.AppendProtoAsArrayOfBytes(submit); |
| |
| dbus::ObjectProxy* object = bus_->GetObjectProxy( |
| feedback::kFeedbackServiceName, |
| dbus::ObjectPath(feedback::kFeedbackServicePath)); |
| |
| scoped_ptr<dbus::Response> response(object->CallMethodAndBlock( |
| &call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
| if (response.get() == nullptr) { |
| callback.Run(false); |
| return true; |
| } |
| |
| bool status = false; |
| const auto &message_type = response->GetMessageType(); |
| if (message_type == dbus::ErrorResponse::MESSAGE_METHOD_RETURN) { |
| dbus::MessageReader reader(response.get()); |
| reader.PopBool(&status); |
| } |
| |
| callback.Run(status); |
| return true; |
| } |