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

#ifndef CHROMEOS_DBUS_BINDINGS_ADAPTOR_GENERATOR_H_
#define CHROMEOS_DBUS_BINDINGS_ADAPTOR_GENERATOR_H_

#include <string>
#include <vector>

#include <base/macros.h>

#include "chromeos-dbus-bindings/header_generator.h"
#include "chromeos-dbus-bindings/indented_text.h"

namespace base {

class FilePath;

}  // namespace base

namespace chromeos_dbus_bindings {

class IndentedText;
struct Interface;

class AdaptorGenerator : public HeaderGenerator {
 public:
  static bool GenerateAdaptors(const std::vector<Interface>& interfaces,
                               const base::FilePath& output_file);

 private:
  friend class AdaptorGeneratorTest;

  // Generates one interface adaptor.
  static void GenerateInterfaceAdaptor(const Interface& interface,
                                       IndentedText *text);

  // Generates the method prototypes for an interface declaration.
  static void AddInterfaceMethods(const Interface& interface,
                                  IndentedText *text);

  // Generates the constructor for the adaptor.
  static void AddConstructor(const Interface& interface,
                             const std::string& class_name,
                             const std::string& itf_name,
                             IndentedText *text);

  // Generates RegisterWithDBusObject() method.
  static void AddRegisterWithDBusObject(const std::string& itf_name,
                                        const Interface& interface,
                                        IndentedText *text);

  // Generates the code to register the interface with a D-Bus object.
  static void RegisterInterface(const std::string& itf_name,
                                const Interface& interface,
                                IndentedText *text);

  // Generates adaptor methods to send the signals.
  static void AddSendSignalMethods(const Interface& interface,
                                   IndentedText *text);

  // Generates DBusSignal data members for the signals.
  static void AddSignalDataMembers(const Interface& interface,
                                   IndentedText *text);

  // Generates adaptor accessor methods for the properties.
  static void AddPropertyMethodImplementation(const Interface& interface,
                                              IndentedText *text);

  // Generate ExportProperty data members for the properties.
  static void AddPropertyDataMembers(const Interface& interface,
                                     IndentedText *text);

  DISALLOW_COPY_AND_ASSIGN(AdaptorGenerator);
};

}  // namespace chromeos_dbus_bindings

#endif  // CHROMEOS_DBUS_BINDINGS_ADAPTOR_GENERATOR_H_
