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 <string>
22 #include <memory>
23 #include <unordered_set>
24 #include <unordered_map>
25 #include <atomic>
26 
27 #include <mutex>
28 
29 #include "mir_protobuf.pb.h"
30 
33 
34 #include "mir/client_platform.h"
35 #include "mir/client_context.h"
36 
37 #include "mir_wait_handle.h"
38 
39 namespace mir
40 {
41 class SharedLibrary;
42 
44 namespace client
45 {
46 class ConnectionConfiguration;
47 class ClientPlatformFactory;
48 class ClientBufferStreamFactory;
49 class ConnectionSurfaceMap;
50 class DisplayConfiguration;
51 class LifecycleControl;
52 class EventHandlerRegister;
53 
54 namespace rpc
55 {
56 class MirBasicRpcChannel;
57 }
58 }
59 
60 namespace input
61 {
62 namespace receiver
63 {
64 class InputPlatform;
65 }
66 }
67 
68 namespace logging
69 {
70 class Logger;
71 }
72 
73 namespace dispatch
74 {
76 }
77 }
78 
80 {
81 public:
82  MirConnection(std::string const& error_message);
83 
85  ~MirConnection() noexcept;
86 
87  MirConnection(MirConnection const &) = delete;
88  MirConnection& operator=(MirConnection const &) = delete;
89 
91  MirSurfaceSpec const& spec,
92  mir_surface_callback callback,
93  void * context);
95  MirSurface *surface,
96  mir_surface_callback callback,
97  void *context);
98 
100 
101  char const * get_error_message();
102 
104  const char* app_name,
105  mir_connected_callback callback,
106  void * context);
107 
109 
111  MirPlatformMessage const* request,
112  mir_platform_operation_callback callback, void* context);
113 
115 
117 
118  void populate(MirPlatformPackage& platform_package);
121  unsigned int formats_size, unsigned int& valid_formats);
122 
123  std::shared_ptr<mir::client::ClientPlatform> get_client_platform();
124  std::shared_ptr<mir::client::ClientBufferStreamFactory> get_client_buffer_stream_factory();
125 
126  static bool is_valid(MirConnection *connection);
127 
128  EGLNativeDisplayType egl_native_display();
129 
130  void on_surface_created(int id, MirSurface* surface);
131 
133  void done_display_configure();
134 
135  std::shared_ptr<google::protobuf::RpcChannel> rpc_channel() const
136  {
137  return channel;
138  }
139 
140  mir::protobuf::DisplayServer& display_server();
141  std::shared_ptr<mir::logging::Logger> const& the_logger() const;
142 
143 private:
144  void populate_server_package(MirPlatformPackage& platform_package) override;
145  // MUST be first data member so it is destroyed last.
146  struct Deregisterer
147  { MirConnection* const self; ~Deregisterer(); } deregisterer;
148 
149  // MUST be placed before any variables for components that are loaded
150  // from a shared library, e.g., the ClientPlatform* objects.
151  std::shared_ptr<mir::SharedLibrary> const platform_library;
152 
153  std::mutex mutex; // Protects all members of *this (except release_wait_handles)
154 
155  std::shared_ptr<google::protobuf::RpcChannel> const channel;
156  mir::protobuf::DisplayServer::Stub server;
157  mir::protobuf::Debug::Stub debug;
158  std::shared_ptr<mir::logging::Logger> const logger;
159  mir::protobuf::Void void_response;
160  mir::protobuf::Connection connect_result;
161  std::atomic<bool> connect_done;
162  mir::protobuf::Void ignored;
163  mir::protobuf::ConnectParameters connect_parameters;
164  mir::protobuf::PlatformOperationMessage platform_operation_reply;
165  mir::protobuf::DisplayConfiguration display_configuration_response;
166  bool disconnecting{false};
167 
168  std::shared_ptr<mir::client::ClientPlatformFactory> const client_platform_factory;
169  std::shared_ptr<mir::client::ClientPlatform> platform;
170  std::shared_ptr<EGLNativeDisplayType> native_display;
171 
172  std::shared_ptr<mir::input::receiver::InputPlatform> const input_platform;
173 
174  std::string error_message;
175 
176  MirWaitHandle connect_wait_handle;
177  MirWaitHandle disconnect_wait_handle;
178  MirWaitHandle platform_operation_wait_handle;
179  MirWaitHandle configure_display_wait_handle;
180 
181  std::mutex release_wait_handle_guard;
182  std::vector<MirWaitHandle*> release_wait_handles;
183 
184  std::shared_ptr<mir::client::DisplayConfiguration> const display_configuration;
185 
186  std::shared_ptr<mir::client::LifecycleControl> const lifecycle_control;
187 
188  std::shared_ptr<mir::client::ConnectionSurfaceMap> const surface_map;
189 
190  std::shared_ptr<mir::client::EventHandlerRegister> const event_handler_register;
191 
192  std::unique_ptr<mir::dispatch::SimpleDispatchThread> const eventloop;
193 
194  std::shared_ptr<mir::client::ClientBufferStreamFactory> buffer_stream_factory;
195 
196  struct SurfaceRelease;
197 
198  MirConnection* next_valid{nullptr};
199 
200  void set_error_message(std::string const& error);
201  void done_disconnect();
202  void connected(mir_connected_callback callback, void * context);
203  void released(SurfaceRelease );
204  void done_platform_operation(mir_platform_operation_callback, void* context);
205  bool validate_user_display_config(MirDisplayConfiguration* config);
206 };
207 
208 #endif /* MIR_CLIENT_MIR_CONNECTION_H_ */
MirWaitHandle * connect(const char *app_name, mir_connected_callback callback, void *context)
Definition: mir_connection.cpp:288
All things Mir.
Definition: buffer_stream.h:37
Definition: client_types.h:167
Definition: client_types.h:270
Definition: mir_surface.h:58
Definition: mir_surface.h:86
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:98
MirPromptSession * create_prompt_session()
Definition: mir_connection.cpp:223
Definition: mir_wait_handle.h:31
MirConnection & operator=(MirConnection const &)=delete
std::shared_ptr< mir::logging::Logger > const & the_logger() const
Definition: mir_connection.cpp:577
MirWaitHandle * create_surface(MirSurfaceSpec const &spec, mir_surface_callback callback, void *context)
Definition: mir_connection.cpp:143
void available_surface_formats(MirPixelFormat *formats, unsigned int formats_size, unsigned int &valid_formats)
Definition: mir_connection.cpp:444
MirWaitHandle * release_surface(MirSurface *surface, mir_surface_callback callback, void *context)
Definition: mir_connection.cpp:198
Definition: simple_dispatch_thread.h:33
void done_display_configure()
Definition: mir_connection.cpp:527
MirWaitHandle * platform_operation(MirPlatformMessage const *request, mir_platform_operation_callback callback, void *context)
Definition: mir_connection.cpp:359
std::shared_ptr< mir::client::ClientPlatform > get_client_platform()
Definition: mir_connection.cpp:465
EGLNativeDisplayType egl_native_display()
Definition: mir_connection.cpp:480
struct MirPlatformMessage MirPlatformMessage
Definition: client_types.h:59
void(* mir_platform_operation_callback)(MirConnection *connection, MirPlatformMessage *reply, void *context)
Callback called when a platform operation completes.
Definition: client_types.h:353
void populate(MirPlatformPackage &platform_package)
Definition: mir_connection.cpp:410
void register_display_change_callback(mir_display_config_callback callback, void *context)
Definition: mir_connection.cpp:497
Definition: mir_prompt_session.h:40
std::shared_ptr< mir::client::ClientBufferStreamFactory > get_client_buffer_stream_factory()
Definition: mir_connection.cpp:472
MirPixelFormat
The order of components in a format enum matches the order of the components as they would be written...
Definition: common.h:127
void(* mir_surface_callback)(MirSurface *surface, void *client_context)
Callback to be passed when calling:
Definition: client_types.h:78
Definition: client_context.h:29
std::shared_ptr< google::protobuf::RpcChannel > rpc_channel() const
Definition: mir_connection.h:135
void on_surface_created(int id, MirSurface *surface)
Definition: mir_connection.cpp:487
~MirConnection() noexcept
Definition: mir_connection.cpp:128
MirWaitHandle * disconnect()
Definition: mir_connection.cpp:324
MirWaitHandle * configure_display(MirDisplayConfiguration *configuration)
Definition: mir_connection.cpp:539
void(* mir_connected_callback)(MirConnection *connection, void *client_context)
Callback to be passed when issuing a mir_connect request.
Definition: client_types.h:67
MirConnection(std::string const &error_message)
Definition: mir_connection.cpp:95
error
Definition: connector_report_tp.h:60
char const * get_error_message()
Definition: mir_connection.cpp:154
Definition: mir_connection.h:79
void register_lifecycle_event_callback(mir_lifecycle_event_callback callback, void *context)
Definition: mir_connection.cpp:492
Definition: connection_configuration.h:52
mir::protobuf::DisplayServer & display_server()
Definition: mir_connection.cpp:572
void(* mir_display_config_callback)(MirConnection *connection, void *context)
Callback called when a display config change has occurred.
Definition: client_types.h:107
static bool is_valid(MirConnection *connection)
Definition: mir_connection.cpp:393
MirDisplayConfiguration * create_copy_of_display_config()
Definition: mir_connection.cpp:438

Copyright © 2012,2013 Canonical Ltd.
Generated on Tue Mar 24 16:15:19 UTC 2015