| // Copyright (c) 2012 The Chromium 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 "chromeos/network/network_handler_callbacks.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/logging.h" | 
 | #include "base/memory/ptr_util.h" | 
 | #include "base/values.h" | 
 | #include "components/device_event_log/device_event_log.h" | 
 |  | 
 | namespace { | 
 |  | 
 | bool SuppressError(const std::string& dbus_error_message) { | 
 |   if (dbus_error_message == "Wake on WiFi not supported") | 
 |     return true; | 
 |   return false; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | namespace chromeos { | 
 | namespace network_handler { | 
 |  | 
 | // None of these messages are user-facing, they should only appear in logs. | 
 | const char kDBusFailedError[] = "Error.DBusFailed"; | 
 | const char kDBusFailedErrorMessage[] = "DBus call failed."; | 
 |  | 
 | // These are names of fields in the error data dictionary for ErrorCallback. | 
 | const char kErrorName[] = "errorName"; | 
 | const char kErrorDetail[] = "errorDetail"; | 
 | const char kDbusErrorName[] = "dbusErrorName"; | 
 | const char kDbusErrorMessage[] = "dbusErrorMessage"; | 
 | const char kPath[] = "path"; | 
 |  | 
 | base::DictionaryValue* CreateErrorData(const std::string& path, | 
 |                                        const std::string& error_name, | 
 |                                        const std::string& error_detail) { | 
 |   return CreateDBusErrorData(path, error_name, error_detail, "", ""); | 
 | } | 
 |  | 
 | void RunErrorCallback(const ErrorCallback& error_callback, | 
 |                       const std::string& path, | 
 |                       const std::string& error_name, | 
 |                       const std::string& error_detail) { | 
 |   if (error_callback.is_null()) | 
 |     return; | 
 |   error_callback.Run(error_name, base::WrapUnique(CreateErrorData( | 
 |                                      path, error_name, error_detail))); | 
 | } | 
 |  | 
 | base::DictionaryValue* CreateDBusErrorData( | 
 |     const std::string& path, | 
 |     const std::string& error_name, | 
 |     const std::string& error_detail, | 
 |     const std::string& dbus_error_name, | 
 |     const std::string& dbus_error_message) { | 
 |   base::DictionaryValue* error_data(new base::DictionaryValue); | 
 |   error_data->SetString(kErrorName, error_name); | 
 |   error_data->SetString(kErrorDetail, error_detail); | 
 |   error_data->SetString(kDbusErrorName, dbus_error_name); | 
 |   error_data->SetString(kDbusErrorMessage, dbus_error_message); | 
 |   if (!path.empty()) | 
 |     error_data->SetString(kPath, path); | 
 |   return error_data; | 
 | } | 
 |  | 
 | void ShillErrorCallbackFunction(const std::string& error_name, | 
 |                                 const std::string& path, | 
 |                                 const ErrorCallback& error_callback, | 
 |                                 const std::string& dbus_error_name, | 
 |                                 const std::string& dbus_error_message) { | 
 |   std::string detail = error_name + ": "; | 
 |   if (!path.empty()) | 
 |     detail += path + ": "; | 
 |   detail += dbus_error_name; | 
 |   if (!dbus_error_message.empty()) | 
 |     detail += ": " + dbus_error_message; | 
 |   device_event_log::LogLevel log_level = | 
 |       SuppressError(dbus_error_message) ? device_event_log::LOG_LEVEL_DEBUG | 
 |                                         : device_event_log::LOG_LEVEL_ERROR; | 
 |   DEVICE_LOG(::device_event_log::LOG_TYPE_NETWORK, log_level) << detail; | 
 |  | 
 |   if (error_callback.is_null()) | 
 |     return; | 
 |   std::unique_ptr<base::DictionaryValue> error_data(CreateDBusErrorData( | 
 |       path, error_name, detail, dbus_error_name, dbus_error_message)); | 
 |   error_callback.Run(error_name, std::move(error_data)); | 
 | } | 
 |  | 
 | void GetPropertiesCallback(const DictionaryResultCallback& callback, | 
 |                            const ErrorCallback& error_callback, | 
 |                            const std::string& path, | 
 |                            DBusMethodCallStatus call_status, | 
 |                            const base::DictionaryValue& value) { | 
 |   if (call_status != DBUS_METHOD_CALL_SUCCESS) { | 
 |     NET_LOG(ERROR) << "GetProperties failed: " << path | 
 |                    << " Status: " << call_status; | 
 |     RunErrorCallback( | 
 |         error_callback, path, kDBusFailedError, kDBusFailedErrorMessage); | 
 |   } else if (!callback.is_null()) { | 
 |     callback.Run(path, value); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace network_handler | 
 | }  // namespace chromeos |