// 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.

// DBusParamWriter::Append(writer, ...) provides functionality opposite
// to that of DBusParamReader. It writes each of the arguments to D-Bus message
// writer and return true if successful.

// DBusParamWriter::AppendDBusOutParams(writer, ...) is similar to Append()
// but is used to send out the D-Bus OUT (pointer type) parameters in a D-Bus
// method response message. This method skips any non-pointer parameters and
// only appends the data for arguments that are pointers.

#ifndef LIBBRILLO_BRILLO_DBUS_DBUS_PARAM_WRITER_H_
#define LIBBRILLO_BRILLO_DBUS_DBUS_PARAM_WRITER_H_

#include <brillo/dbus/data_serialization.h>
#include <dbus/message.h>

namespace brillo {
namespace dbus_utils {

class DBusParamWriter final {
 public:
  // Generic writer method that takes 1 or more arguments. It recursively calls
  // itself (each time with one fewer arguments) until no more is left.
  template <typename ParamType, typename... RestOfParams>
  static void Append(::dbus::MessageWriter* writer,
                     const ParamType& param,
                     const RestOfParams&... rest) {
    // Append the current |param| to D-Bus, then call Append() with one
    // fewer arguments, until none is left and stand-alone version of
    // Append(dbus::MessageWriter*) is called to end the iteration.
    DBusType<ParamType>::Write(writer, param);
    Append(writer, rest...);
  }

  // The final overload of DBusParamWriter::Append() used when no more
  // parameters are remaining to be written.
  // Does nothing and finishes meta-recursion.
  static void Append(::dbus::MessageWriter* /*writer*/) {}

  // Generic writer method that takes 1 or more arguments. It recursively calls
  // itself (each time with one fewer arguments) until no more is left.
  // Handles non-pointer parameter by just skipping over it.
  template <typename ParamType, typename... RestOfParams>
  static void AppendDBusOutParams(::dbus::MessageWriter* writer,
                                  const ParamType& /* param */,
                                  const RestOfParams&... rest) {
    // Skip the current |param| and call Append() with one fewer arguments,
    // until none is left and stand-alone version of
    // AppendDBusOutParams(dbus::MessageWriter*) is called to end the iteration.
    AppendDBusOutParams(writer, rest...);
  }

  // Generic writer method that takes 1 or more arguments. It recursively calls
  // itself (each time with one fewer arguments) until no more is left.
  // Handles only a parameter of pointer type and writes the data pointed to
  // to the output message buffer.
  template <typename ParamType, typename... RestOfParams>
  static void AppendDBusOutParams(::dbus::MessageWriter* writer,
                                  ParamType* param,
                                  const RestOfParams&... rest) {
    // Append the current |param| to D-Bus, then call Append() with one
    // fewer arguments, until none is left and stand-alone version of
    // Append(dbus::MessageWriter*) is called to end the iteration.
    DBusType<ParamType>::Write(writer, *param);
    AppendDBusOutParams(writer, rest...);
  }

  // The final overload of DBusParamWriter::AppendDBusOutParams() used when no
  // more parameters are remaining to be written.
  // Does nothing and finishes meta-recursion.
  static void AppendDBusOutParams(::dbus::MessageWriter* /*writer*/) {}
};

}  // namespace dbus_utils
}  // namespace brillo

#endif  // LIBBRILLO_BRILLO_DBUS_DBUS_PARAM_WRITER_H_
