C++程序  |  199行  |  8.09 KB

// 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_PROXY_GENERATOR_H_
#define CHROMEOS_DBUS_BINDINGS_PROXY_GENERATOR_H_

#include <string>
#include <vector>

#include <base/macros.h>

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

namespace base {

class FilePath;

}  // namespace base

namespace chromeos_dbus_bindings {

class IndentedText;
struct Interface;

class ProxyGenerator : public HeaderGenerator {
 public:
  static bool GenerateProxies(const ServiceConfig& config,
                              const std::vector<Interface>& interfaces,
                              const base::FilePath& output_file);

  static bool GenerateMocks(const ServiceConfig& config,
                            const std::vector<Interface>& interfaces,
                            const base::FilePath& mock_file,
                            const base::FilePath& proxy_file,
                            bool use_literal_proxy_file);

 private:
  friend class ProxyGeneratorTest;

  // Generates an abstract interface for one D-Bus interface proxy.
  static void GenerateInterfaceProxyInterface(const ServiceConfig& config,
                                              const Interface& interface,
                                              IndentedText* text);

  // Generates one interface proxy.
  static void GenerateInterfaceProxy(const ServiceConfig& config,
                                     const Interface& interface,
                                     IndentedText* text);

  // Generates one interface mock object.
  static void GenerateInterfaceMock(const ServiceConfig& config,
                                    const Interface& interface,
                                    IndentedText* text);

  // Generates the constructor and destructor for the proxy.
  static void AddConstructor(const ServiceConfig& config,
                             const Interface& interface,
                             const std::string& class_name,
                             IndentedText* text);
  static void AddDestructor(const std::string& class_name,
                            IndentedText* text);

  // Generates ReleaseObjectProxy() method to release ownership
  // of the object proxy.
  static void AddReleaseObjectProxy(IndentedText* text);

  // Generates AddGetObjectPath() method.
  static void AddGetObjectPath(IndentedText* text);

  // Generates GetObjectProxy() method.
  static void AddGetObjectProxy(IndentedText* text);

  // Generates SetPropertyChangedCallback/GetProperties() methods.
  static void AddPropertyPublicMethods(const std::string& class_name,
                                       bool declaration_only,
                                       IndentedText* text);

  // Generates OnPropertyChanged() method.
  static void AddOnPropertyChanged(IndentedText* text);

  // Generates logic permitting users to register handlers for signals.
  static void AddSignalHandlerRegistration(const Interface::Signal& signal,
                                           const std::string& interface_name,
                                           bool declaration_only,
                                           IndentedText* text);

  // Generates the property set class to contain interface properties.
  static void AddPropertySet(const ServiceConfig& config,
                             const Interface& interface,
                             IndentedText* text);

  // Generates the property accessors.
  static void AddProperties(const ServiceConfig& config,
                            const Interface& interface,
                            bool declaration_only,
                            IndentedText* text);

  // Generates a native C++ method which calls a D-Bus method on the proxy.
  static void AddMethodProxy(const Interface::Method& interface,
                             const std::string& interface_name,
                             bool declaration_only,
                             IndentedText* text);

  // Generates a native C++ method which calls a D-Bus method asynchronously.
  static void AddAsyncMethodProxy(const Interface::Method& interface,
                                  const std::string& interface_name,
                                  bool declaration_only,
                                  IndentedText* text);

  // Generates a mock for blocking D-Bus method.
  static void AddMethodMock(const Interface::Method& interface,
                            const std::string& interface_name,
                            IndentedText* text);

  // Generates a mock for asynchronous D-Bus method.
  static void AddAsyncMethodMock(const Interface::Method& interface,
                                 const std::string& interface_name,
                                 IndentedText* text);

  // Generates the MOCK_METHOD entry for the given arguments handling methods
  // with more than 10 arguments.
  static void AddMockMethodDeclaration(
      const std::string& method_name,
      const std::string& return_type,
      const std::vector<std::string>& arguments,
      IndentedText* text);

  // Generates a mock for the signal handler registration method.
  static void AddSignalHandlerRegistrationMock(
      const Interface::Signal& signal,
      IndentedText* text);

  // Generate the signal callback argument of a signal handler.
  static void AddSignalCallbackArg(const Interface::Signal& signal,
                                   bool comment_arg_name,
                                   IndentedText* block);

  // Generates the Object Manager proxy class.
  struct ObjectManager {
    // Generates the top-level class for Object Manager proxy.
    static void GenerateProxy(const ServiceConfig& config,
                              const std::vector<Interface>& interfaces,
                              IndentedText* text);

    // Generates Object Manager constructor.
    static void AddConstructor(const ServiceConfig& config,
                               const std::string& class_name,
                               const std::vector<Interface>& interfaces,
                               IndentedText* text);

    // Generates Object Manager destructor.
    static void AddDestructor(const std::string& class_name,
                              const std::vector<Interface>& interfaces,
                              IndentedText* text);

    // Generates GetObjectManagerProxy() method.
    static void AddGetObjectManagerProxy(IndentedText* text);

    // Generates code for interface-specific accessor methods
    static void AddInterfaceAccessors(const Interface& interface,
                                      IndentedText* text);

    // Generates OnPropertyChanged() method.
    static void AddOnPropertyChanged(const std::vector<Interface>& interfaces,
                                     IndentedText* text);

    // Generates ObjectAdded() method.
    static void AddObjectAdded(const ServiceConfig& config,
                               const std::vector<Interface>& interfaces,
                               IndentedText* text);

    // Generates ObjectRemoved() method.
    static void AddObjectRemoved(const std::vector<Interface>& interfaces,
                                 IndentedText* text);

    // Generates CreateProperties() method.
    static void AddCreateProperties(const std::vector<Interface>& interfaces,
                                    const std::string& class_name,
                                    IndentedText* text);

    // Generates data members of the class.
    static void AddDataMembers(const ServiceConfig& config,
                               const std::vector<Interface>& interfaces,
                               const std::string& class_name,
                               IndentedText* text);
  };
  // Generates the signal handler name for a given signal name.
  static std::string GetHandlerNameForSignal(const std::string& signal);

  DISALLOW_COPY_AND_ASSIGN(ProxyGenerator);
};

}  // namespace chromeos_dbus_bindings

#endif  // CHROMEOS_DBUS_BINDINGS_PROXY_GENERATOR_H_