1b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// Copyright 2014 The Chromium OS Authors. All rights reserved.
2b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be
3b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// found in the LICENSE file.
4b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
5fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#ifndef LIBBRILLO_BRILLO_DBUS_UTILS_H_
6fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#define LIBBRILLO_BRILLO_DBUS_UTILS_H_
7b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
8b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko#include <memory>
9b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko#include <string>
10b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
119ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/brillo_export.h>
129ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/errors/error.h>
13b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko#include <dbus/exported_object.h>
14b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko#include <dbus/message.h>
151363ed6670b25ab10003dbeb0f31c5aa63077642Alex Vakulenko#include <dbus/scoped_dbus_error.h>
16b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
179ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo {
18b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenkonamespace dbus_utils {
19b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
20b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// A helper function to create a D-Bus error response object as unique_ptr<>.
219ed0cab99f18acb3570a35e9408f24355f6b8324Alex VakulenkoBRILLO_EXPORT std::unique_ptr<dbus::Response> CreateDBusErrorResponse(
22b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko    dbus::MethodCall* method_call,
23f437e3b367869af7cb5a53153284566164b48a7cAlex Vakulenko    const std::string& error_name,
24f437e3b367869af7cb5a53153284566164b48a7cAlex Vakulenko    const std::string& error_message);
25b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
269ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko// Create a D-Bus error response object from brillo::Error. If the last
27b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// error in the error chain belongs to "dbus" error domain, its error code
28b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// and message are directly translated to D-Bus error code and message.
29b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// Any inner errors are formatted as "domain/code:message" string and appended
30b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko// to the D-Bus error message, delimited by semi-colons.
319ed0cab99f18acb3570a35e9408f24355f6b8324Alex VakulenkoBRILLO_EXPORT std::unique_ptr<dbus::Response> GetDBusError(
32847b871c166235af441bd59572dd9aabcd8ae976Alex Vakulenko    dbus::MethodCall* method_call,
339ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko    const brillo::Error* error);
34b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
3500ceab8b84907509eaec878e1ae11ea36c18d441Alex Vakulenko// AddDBusError() is the opposite of GetDBusError(). It de-serializes the Error
3600ceab8b84907509eaec878e1ae11ea36c18d441Alex Vakulenko// object received over D-Bus.
379ed0cab99f18acb3570a35e9408f24355f6b8324Alex VakulenkoBRILLO_EXPORT void AddDBusError(brillo::ErrorPtr* error,
389ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko                                const std::string& dbus_error_name,
399ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko                                const std::string& dbus_error_message);
4000ceab8b84907509eaec878e1ae11ea36c18d441Alex Vakulenko
41b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko}  // namespace dbus_utils
429ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko}  // namespace brillo
43b381365edadcac463c07d045ad29b43ef96099a1Alex Vakulenko
44fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#endif  // LIBBRILLO_BRILLO_DBUS_UTILS_H_
45