Mir
mir_connection.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2012 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License version 3,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: Kevin DuBois <kevin.dubois@canonical.com>
17  */
18 #ifndef MIR_CLIENT_MIR_CONNECTION_H_
19 #define MIR_CLIENT_MIR_CONNECTION_H_
20 
21 #include "mir_wait_handle.h"
22 #include "lifecycle_control.h"
23 #include "ping_handler.h"
24 #include "rpc/mir_display_server.h"
26 
27 #include "mir/geometry/size.h"
28 #include "mir/client_platform.h"
29 #include "mir/client_context.h"
31 
32 #include <atomic>
33 #include <memory>
34 #include <mutex>
35 #include <string>
36 #include <unordered_set>
37 #include <unordered_map>
38 
39 namespace mir
40 {
41 class SharedLibrary;
42 namespace protobuf
43 {
44 class BufferStream;
45 class Connection;
46 class ConnectParameters;
47 class PlatformOperationMessage;
48 class DisplayConfiguration;
49 }
51 namespace client
52 {
53 class ConnectionConfiguration;
54 class ClientPlatformFactory;
55 class ClientBufferStream;
56 class ClientBufferStreamFactory;
57 class ConnectionSurfaceMap;
58 class DisplayConfiguration;
59 class EventHandlerRegister;
60 
61 namespace rpc
62 {
63 class DisplayServer;
64 class DisplayServerDebug;
65 class MirBasicRpcChannel;
66 }
67 }
68 
69 namespace input
70 {
71 namespace receiver
72 {
73 class InputPlatform;
74 }
75 }
76 
77 namespace logging
78 {
79 class Logger;
80 }
81 
82 namespace dispatch
83 {
84 class ThreadedDispatcher;
85 }
86 }
87 
89 {
90 public:
91  MirConnection(std::string const& error_message);
92 
94  ~MirConnection() noexcept;
95 
96  MirConnection(MirConnection const &) = delete;
97  MirConnection& operator=(MirConnection const &) = delete;
98 
100  MirSurfaceSpec const& spec,
101  mir_surface_callback callback,
102  void * context);
104  MirSurface *surface,
105  mir_surface_callback callback,
106  void *context);
107 
109 
110  char const * get_error_message();
111 
113  const char* app_name,
114  mir_connected_callback callback,
115  void * context);
116 
118 
120  MirPlatformMessage const* request,
121  mir_platform_operation_callback callback, void* context);
122 
124 
125  void register_ping_event_callback(mir_ping_event_callback callback, void* context);
126  void pong(int32_t serial);
127 
129 
130  void populate(MirPlatformPackage& platform_package);
133  unsigned int formats_size, unsigned int& valid_formats);
134 
135  std::shared_ptr<mir::client::ClientPlatform> get_client_platform();
136 
137  std::shared_ptr<mir::client::ClientBufferStream> make_consumer_stream(
138  mir::protobuf::BufferStream const& protobuf_bs, std::string const& surface_name, mir::geometry::Size);
139 
141  int width, int height,
142  MirPixelFormat format,
143  MirBufferUsage buffer_usage,
145  void *context);
149  void *context);
150 
152 
153  static bool is_valid(MirConnection *connection);
154 
155  EGLNativeDisplayType egl_native_display();
156  MirPixelFormat egl_pixel_format(EGLDisplay, EGLConfig) const;
157 
158  void on_surface_created(int id, MirSurface* surface);
160 
162  void done_display_configure();
163 
164  std::shared_ptr<mir::client::rpc::MirBasicRpcChannel> rpc_channel() const
165  {
166  return channel;
167  }
168 
170  std::shared_ptr<mir::logging::Logger> const& the_logger() const;
171 
172 private:
173  void populate_server_package(MirPlatformPackage& platform_package) override;
174  // MUST be first data member so it is destroyed last.
175  struct Deregisterer
176  { MirConnection* const self; ~Deregisterer(); } deregisterer;
177 
178  // MUST be placed before any variables for components that are loaded
179  // from a shared library, e.g., the ClientPlatform* objects.
180  std::shared_ptr<mir::SharedLibrary> const platform_library;
181 
182  mutable std::mutex mutex; // Protects all members of *this (except release_wait_handles)
183 
184  std::shared_ptr<mir::client::rpc::MirBasicRpcChannel> const channel;
187  std::shared_ptr<mir::logging::Logger> const logger;
188  std::unique_ptr<mir::protobuf::Void> void_response;
189  std::unique_ptr<mir::protobuf::Connection> connect_result;
190  std::atomic<bool> connect_done;
191  std::unique_ptr<mir::protobuf::Void> ignored;
192  std::unique_ptr<mir::protobuf::ConnectParameters> connect_parameters;
193  std::unique_ptr<mir::protobuf::PlatformOperationMessage> platform_operation_reply;
194  std::unique_ptr<mir::protobuf::DisplayConfiguration> display_configuration_response;
195  std::atomic<bool> disconnecting{false};
196 
197  std::shared_ptr<mir::client::ClientPlatformFactory> const client_platform_factory;
198  std::shared_ptr<mir::client::ClientPlatform> platform;
199  std::shared_ptr<EGLNativeDisplayType> native_display;
200 
201  std::shared_ptr<mir::input::receiver::InputPlatform> const input_platform;
202 
203  std::string error_message;
204 
205  MirWaitHandle connect_wait_handle;
206  MirWaitHandle disconnect_wait_handle;
207  MirWaitHandle platform_operation_wait_handle;
208  MirWaitHandle configure_display_wait_handle;
209 
210  std::mutex release_wait_handle_guard;
211  std::vector<MirWaitHandle*> release_wait_handles;
212 
213  std::shared_ptr<mir::client::DisplayConfiguration> const display_configuration;
214 
215  std::shared_ptr<mir::client::LifecycleControl> const lifecycle_control;
216 
217  std::shared_ptr<mir::client::PingHandler> const ping_handler;
218 
219  std::shared_ptr<mir::client::ConnectionSurfaceMap> const surface_map;
220 
221  std::shared_ptr<mir::client::EventHandlerRegister> const event_handler_register;
222 
223  std::unique_ptr<google::protobuf::Closure> const pong_callback;
224 
225  std::unique_ptr<mir::dispatch::ThreadedDispatcher> const eventloop;
226 
227  std::shared_ptr<mir::client::ClientBufferStreamFactory> buffer_stream_factory;
228 
229  struct SurfaceRelease;
230  struct StreamRelease;
231 
232  MirConnection* next_valid{nullptr};
233 
234  void set_error_message(std::string const& error);
235  void done_disconnect();
236  void connected(mir_connected_callback callback, void * context);
237  void released(SurfaceRelease);
238  void released(StreamRelease);
239  void done_platform_operation(mir_platform_operation_callback, void* context);
240  bool validate_user_display_config(MirDisplayConfiguration* config);
241 };
242 
243 #endif /* MIR_CLIENT_MIR_CONNECTION_H_ */
Definition: size.h:30
MirWaitHandle * connect(const char *app_name, mir_connected_callback callback, void *context)
Definition: mir_connection.cpp:305
All things Mir.
Definition: atomic_callback.h:25
Definition: client_types.h:186
Definition: client_types.h:289
Definition: mir_surface.h:77
Definition: mir_surface.h:136
void(* mir_lifecycle_event_callback)(MirConnection *connection, MirLifecycleState state, void *context)
Callback called when a lifecycle event/callback is requested from the running server.
Definition: client_types.h:103
mir::client::rpc::DisplayServer & display_server()
Definition: mir_connection.cpp:625
MirPromptSession * create_prompt_session()
Definition: mir_connection.cpp:250
Definition: mir_wait_handle.h:31
void(* mir_buffer_stream_callback)(MirBufferStream *stream, void *client_context)
Callback to be passed when calling:
Definition: client_types.h:84
void release_consumer_stream(mir::client::ClientBufferStream *)
Definition: mir_connection.cpp:659
MirConnection & operator=(MirConnection const &)=delete
std::shared_ptr< mir::logging::Logger > const & the_logger() const
Definition: mir_connection.cpp:630
MirWaitHandle * create_surface(MirSurfaceSpec const &spec, mir_surface_callback callback, void *context)
Definition: mir_connection.cpp:153
void available_surface_formats(MirPixelFormat *formats, unsigned int formats_size, unsigned int &valid_formats)
Definition: mir_connection.cpp:459
MirWaitHandle * release_surface(MirSurface *surface, mir_surface_callback callback, void *context)
Definition: mir_connection.cpp:225
void done_display_configure()
Definition: mir_connection.cpp:580
MirWaitHandle * platform_operation(MirPlatformMessage const *request, mir_platform_operation_callback callback, void *context)
Definition: mir_connection.cpp:375
std::shared_ptr< mir::client::ClientPlatform > get_client_platform()
Definition: mir_connection.cpp:480
mir::client::ClientBufferStream * create_client_buffer_stream(int width, int height, MirPixelFormat format, MirBufferUsage buffer_usage, mir_buffer_stream_callback callback, void *context)
Definition: mir_connection.cpp:488
unsigned int width
Definition: black_arrow.c:4
void(* mir_ping_event_callback)(MirConnection *connection, int32_t serial, void *context)
Callback called when the server pings for responsiveness testing.
Definition: client_types.h:113
EGLNativeDisplayType egl_native_display()
Definition: mir_connection.cpp:510
struct MirPlatformMessage MirPlatformMessage
Definition: client_types.h:56
Definition: mir_display_server_debug.h:32
void(* mir_platform_operation_callback)(MirConnection *connection, MirPlatformMessage *reply, void *context)
Callback called when a platform operation completes.
Definition: client_types.h:372
void pong(int32_t serial)
Definition: mir_connection.cpp:543
void populate(MirPlatformPackage &platform_package)
Definition: mir_connection.cpp:425
void register_ping_event_callback(mir_ping_event_callback callback, void *context)
Definition: mir_connection.cpp:538
void register_display_change_callback(mir_display_config_callback callback, void *context)
Definition: mir_connection.cpp:550
MirBufferUsage
MirBufferUsage specifies how a surface can and will be used.
Definition: client_types.h:147
Definition: mir_prompt_session.h:49
MirPixelFormat
32-bit pixel formats (8888): The order of components in the enum matches the order of the components ...
Definition: common.h:134
void(* mir_surface_callback)(MirSurface *surface, void *client_context)
Callback to be passed when calling:
Definition: client_types.h:75
Definition: client_context.h:29
MirWaitHandle * release_buffer_stream(mir::client::ClientBufferStream *, mir_buffer_stream_callback callback, void *context)
Definition: mir_connection.cpp:635
void on_surface_created(int id, MirSurface *surface)
Definition: mir_connection.cpp:528
std::shared_ptr< mir::client::rpc::MirBasicRpcChannel > rpc_channel() const
Definition: mir_connection.h:164
~MirConnection() noexcept
Definition: mir_connection.cpp:138
MirWaitHandle * disconnect()
Definition: mir_connection.cpp:340
MirWaitHandle * configure_display(MirDisplayConfiguration *configuration)
Definition: mir_connection.cpp:592
unsigned int height
Definition: black_arrow.c:5
void(* mir_connected_callback)(MirConnection *connection, void *client_context)
Callback to be passed when issuing a mir_connect request.
Definition: client_types.h:64
Definition: client_buffer_stream.h:45
void on_stream_created(int id, mir::client::ClientBufferStream *stream)
Definition: mir_connection.cpp:523
MirConnection(std::string const &error_message)
Definition: mir_connection.cpp:97
error
Definition: connector_report_tp.h:60
char const * get_error_message()
Definition: mir_connection.cpp:164
MirPixelFormat egl_pixel_format(EGLDisplay, EGLConfig) const
Definition: mir_connection.cpp:517
Definition: mir_connection.h:88
void register_lifecycle_event_callback(mir_lifecycle_event_callback callback, void *context)
Definition: mir_connection.cpp:533
Definition: connection_configuration.h:55
void(* mir_display_config_callback)(MirConnection *connection, void *context)
Callback called when a display config change has occurred.
Definition: client_types.h:122
static bool is_valid(MirConnection *connection)
Definition: mir_connection.cpp:408
MirDisplayConfiguration * create_copy_of_display_config()
Definition: mir_connection.cpp:453
Definition: mir_display_server.h:33
std::shared_ptr< mir::client::ClientBufferStream > make_consumer_stream(mir::protobuf::BufferStream const &protobuf_bs, std::string const &surface_name, mir::geometry::Size)
Definition: mir_connection.cpp:504

Copyright © 2012-2015 Canonical Ltd.
Generated on Thu Oct 8 16:20:16 UTC 2015