blob: 682e6dc6dc30a3f48755294830edcebce3aff0fc [file] [log] [blame]
Paul Stewart1dce1ae2014-10-01 05:30:18 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROMEOS_DBUS_BINDINGS_PROXY_GENERATOR_H_
6#define CHROMEOS_DBUS_BINDINGS_PROXY_GENERATOR_H_
7
8#include <string>
9#include <vector>
10
11#include <base/macros.h>
12
13#include "chromeos-dbus-bindings/header_generator.h"
14#include "chromeos-dbus-bindings/indented_text.h"
15#include "chromeos-dbus-bindings/interface.h"
16
17namespace base {
18
19class FilePath;
20
21} // namespace base
22
23namespace chromeos_dbus_bindings {
24
25class IndentedText;
26struct Interface;
27
28class ProxyGenerator : public HeaderGenerator {
29 public:
Alex Vakulenko6ef2d732014-11-25 14:04:27 -080030 static bool GenerateProxies(const ServiceConfig& config,
31 const std::vector<Interface>& interfaces,
Alex Vakulenkoc95f06b2014-11-20 15:06:09 -080032 const base::FilePath& output_file);
Paul Stewart1dce1ae2014-10-01 05:30:18 -070033
34 private:
35 friend class ProxyGeneratorTest;
36
Alex Vakulenkoc95f06b2014-11-20 15:06:09 -080037 // Generates one interface proxy.
Alex Vakulenko6ef2d732014-11-25 14:04:27 -080038 static void GenerateInterfaceProxy(const ServiceConfig& config,
39 const Interface& interface,
Alex Vakulenkoc95f06b2014-11-20 15:06:09 -080040 IndentedText* text);
41
Paul Stewart1dce1ae2014-10-01 05:30:18 -070042 // Generates the constructor and destructor for the proxy.
Alex Vakulenko6ef2d732014-11-25 14:04:27 -080043 static void AddConstructor(const ServiceConfig& config,
44 const Interface& interface,
Paul Stewart1dce1ae2014-10-01 05:30:18 -070045 const std::string& class_name,
46 IndentedText* text);
47 static void AddDestructor(const std::string& class_name,
48 IndentedText* text);
49
Alex Vakulenkoc95f06b2014-11-20 15:06:09 -080050 // Generates ReleaseObjectProxy() method to release ownership
51 // of the object proxy.
52 static void AddReleaseObjectProxy(IndentedText* text);
Paul Stewart1dce1ae2014-10-01 05:30:18 -070053
Alex Vakulenko99e8fb02014-12-01 17:22:03 -080054 // Generates AddGetObjectPath() method.
55 static void AddGetObjectPath(IndentedText* text);
56
57 // Generates GetObjectProxy() method.
58 static void AddGetObjectProxy(IndentedText* text);
59
60 // Generates SetPropertyChangedCallback/GetProperties() methods.
61 static void AddPropertyPublicMethods(const std::string& class_name,
62 IndentedText* text);
63
64 // Generates OnPropertyChanged() method.
65 static void AddOnPropertyChanged(IndentedText* text);
66
Christopher Wiley824b5242014-12-03 11:58:01 -080067 // Generates logic permitting users to register handlers for signals.
68 static void AddSignalHandlerRegistration(const Interface& interface,
69 IndentedText* text);
Paul Stewart1dce1ae2014-10-01 05:30:18 -070070
Alex Vakulenko99e8fb02014-12-01 17:22:03 -080071 // Generates the property set class to contain interface properties.
72 static void AddPropertySet(const ServiceConfig& config,
73 const Interface& interface,
74 IndentedText* text);
75
76 // Generates the property accessors.
77 static void AddProperties(const ServiceConfig& config,
78 const Interface& interface,
79 IndentedText* text);
80
Paul Stewart1dce1ae2014-10-01 05:30:18 -070081 // Generates a native C++ method which calls a D-Bus method on the proxy.
82 static void AddMethodProxy(const Interface::Method& interface,
83 const std::string& interface_name,
84 IndentedText* text);
85
Alex Vakulenkoc4e32f52014-12-04 08:28:49 -080086 // Generates a native C++ method which calls a D-Bus method asynchronously.
87 static void AddAsyncMethodProxy(const Interface::Method& interface,
88 const std::string& interface_name,
89 IndentedText* text);
90
Alex Vakulenko99e8fb02014-12-01 17:22:03 -080091 // Generates the Object Manager proxy class.
92 struct ObjectManager {
93 // Generates the top-level class for Object Manager proxy.
94 static void GenerateProxy(const ServiceConfig& config,
95 const std::vector<Interface>& interfaces,
96 IndentedText* text);
97
98 // Generates Object Manager constructor.
99 static void AddConstructor(const ServiceConfig& config,
100 const std::string& class_name,
101 const std::vector<Interface>& interfaces,
102 IndentedText* text);
103
Christopher Wileye11e81c2014-12-19 13:10:52 -0800104 // Generates Object Manager destructor.
105 static void AddDestructor(const std::string& class_name,
106 const std::vector<Interface>& interfaces,
107 IndentedText* text);
108
Alex Vakulenko99e8fb02014-12-01 17:22:03 -0800109 // Generates GetObjectManagerProxy() method.
110 static void AddGetObjectManagerProxy(IndentedText* text);
111
112 // Generates code for interface-specific accessor methods
113 static void AddInterfaceAccessors(const Interface& interface,
114 IndentedText* text);
115
116 // Generates OnPropertyChanged() method.
117 static void AddOnPropertyChanged(const std::vector<Interface>& interfaces,
118 IndentedText* text);
119
120 // Generates ObjectAdded() method.
121 static void AddObjectAdded(const std::vector<Interface>& interfaces,
122 IndentedText* text);
123
124 // Generates ObjectRemoved() method.
125 static void AddObjectRemoved(const std::vector<Interface>& interfaces,
126 IndentedText* text);
127
128 // Generates CreateProperties() method.
129 static void AddCreateProperties(const std::vector<Interface>& interfaces,
130 const std::string& class_name,
131 IndentedText* text);
132
133 // Generates data members of the class.
134 static void AddDataMembers(const std::vector<Interface>& interfaces,
135 const std::string& class_name,
136 IndentedText* text);
137 };
Paul Stewart1dce1ae2014-10-01 05:30:18 -0700138 // Generates the signal handler name for a given signal name.
139 static std::string GetHandlerNameForSignal(const std::string& signal);
140
141 DISALLOW_COPY_AND_ASSIGN(ProxyGenerator);
142};
143
144} // namespace chromeos_dbus_bindings
145
146#endif // CHROMEOS_DBUS_BINDINGS_PROXY_GENERATOR_H_