Mir
session_mediator.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2012-2014 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU 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 General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: Alan Griffiths <alan@octopull.co.uk>
17  */
18 
19 #ifndef MIR_FRONTEND_SESSION_MEDIATOR_H_
20 #define MIR_FRONTEND_SESSION_MEDIATOR_H_
21 
22 #include "display_server.h"
23 #include "buffer_stream_tracker.h"
25 #include "protobuf_ipc_factory.h"
26 
32 #include "mir_toolkit/common.h"
33 
34 #include <functional>
35 #include <memory>
36 #include <mutex>
37 #include <vector>
38 
39 namespace mir
40 {
41 namespace cookie
42 {
43 class Authority;
44 }
45 namespace graphics
46 {
47 class Buffer;
48 class Display;
49 class DisplayConfiguration;
50 class GraphicBufferAllocator;
51 }
52 namespace input
53 {
54 class CursorImages;
55 class InputDeviceHub;
56 }
57 
58 namespace scene
59 {
60 class CoordinateTranslator;
61 class ApplicationNotRespondingDetector;
62 }
63 
66 namespace frontend
67 {
68 class ClientBufferTracker;
69 class Shell;
70 class Session;
71 class Surface;
72 class MessageResourceCache;
73 class SessionMediatorReport;
74 class EventSink;
75 class EventSinkFactory;
76 class MessageSender;
77 class DisplayChanger;
78 class Screencast;
79 class PromptSession;
80 class BufferStream;
81 
92 {
93 public:
94 
96  std::shared_ptr<Shell> const& shell,
97  std::shared_ptr<graphics::PlatformIpcOperations> const& ipc_operations,
98  std::shared_ptr<frontend::DisplayChanger> const& display_changer,
99  std::vector<MirPixelFormat> const& surface_pixel_formats,
100  std::shared_ptr<SessionMediatorReport> const& report,
101  std::shared_ptr<EventSinkFactory> const& sink_factory,
102  std::shared_ptr<MessageSender> const& message_sender,
103  std::shared_ptr<MessageResourceCache> const& resource_cache,
104  std::shared_ptr<Screencast> const& screencast,
105  ConnectionContext const& connection_context,
106  std::shared_ptr<input::CursorImages> const& cursor_images,
107  std::shared_ptr<scene::CoordinateTranslator> const& translator,
108  std::shared_ptr<scene::ApplicationNotRespondingDetector> const& anr_detector,
109  std::shared_ptr<cookie::Authority> const& cookie_authority,
110  std::shared_ptr<input::InputDeviceHub> const& hub
111  );
112 
113  ~SessionMediator() noexcept;
114 
115  void client_pid(int pid) override;
116 
117  void connect(
118  mir::protobuf::ConnectParameters const* request,
119  mir::protobuf::Connection* response,
120  google::protobuf::Closure* done) override;
121  void disconnect(
122  mir::protobuf::Void const* request,
123  mir::protobuf::Void* response,
124  google::protobuf::Closure* done) override;
125  void create_surface(
126  mir::protobuf::SurfaceParameters const* request,
127  mir::protobuf::Surface* response,
128  google::protobuf::Closure* done) override;
129  void modify_surface(
130  mir::protobuf::SurfaceModifications const* request,
131  mir::protobuf::Void* response,
132  google::protobuf::Closure* done) override;
133  void release_surface(
134  mir::protobuf::SurfaceId const* request,
135  mir::protobuf::Void* response,
136  google::protobuf::Closure* done) override;
137  void platform_operation(
138  mir::protobuf::PlatformOperationMessage const* request,
139  mir::protobuf::PlatformOperationMessage* response,
140  google::protobuf::Closure* done) override;
141  void configure_surface(
142  mir::protobuf::SurfaceSetting const* request,
143  mir::protobuf::SurfaceSetting* response,
144  google::protobuf::Closure* done) override;
145  void configure_display(
146  mir::protobuf::DisplayConfiguration const* request,
147  mir::protobuf::DisplayConfiguration* response,
148  google::protobuf::Closure* done) override;
149  void set_base_display_configuration(
150  mir::protobuf::DisplayConfiguration const* request,
151  mir::protobuf::Void* response,
152  google::protobuf::Closure* done) override;
153  void preview_base_display_configuration(
154  mir::protobuf::PreviewConfiguration const* request,
155  mir::protobuf::Void* response,
156  google::protobuf::Closure* done) override;
157  void confirm_base_display_configuration(
158  mir::protobuf::DisplayConfiguration const* request,
159  mir::protobuf::Void* response,
160  google::protobuf::Closure* done) override;
161  void create_screencast(
162  mir::protobuf::ScreencastParameters const* request,
163  mir::protobuf::Screencast* response,
164  google::protobuf::Closure* done) override;
165  void screencast_buffer(
166  mir::protobuf::ScreencastId const* request,
167  mir::protobuf::Buffer* response,
168  google::protobuf::Closure* done) override;
169  void release_screencast(
170  mir::protobuf::ScreencastId const* request,
171  mir::protobuf::Void* response,
172  google::protobuf::Closure* done) override;
173  void create_buffer_stream(
174  mir::protobuf::BufferStreamParameters const* request,
175  mir::protobuf::BufferStream* response,
176  google::protobuf::Closure* done) override;
177  void release_buffer_stream(
178  mir::protobuf::BufferStreamId const* request,
179  mir::protobuf::Void* response,
180  google::protobuf::Closure* done) override;
181  void configure_cursor(
182  mir::protobuf::CursorSetting const* request,
183  mir::protobuf::Void* response,
184  google::protobuf::Closure* done) override;
185  void new_fds_for_prompt_providers(
186  mir::protobuf::SocketFDRequest const* request,
187  mir::protobuf::SocketFD* response,
188  google::protobuf::Closure* done) override;
189  void start_prompt_session(
190  mir::protobuf::PromptSessionParameters const* request,
191  mir::protobuf::Void* response,
192  google::protobuf::Closure* done) override;
193  void stop_prompt_session(
194  mir::protobuf::Void const* request,
195  mir::protobuf::Void* response,
196  google::protobuf::Closure* done) override;
197  void exchange_buffer(
198  mir::protobuf::BufferRequest const* request,
199  mir::protobuf::Buffer* response,
200  google::protobuf::Closure* done) override;
201  void submit_buffer(
202  mir::protobuf::BufferRequest const* request,
203  mir::protobuf::Void* response,
204  google::protobuf::Closure* done) override;
205  void allocate_buffers(
206  mir::protobuf::BufferAllocation const* request,
207  mir::protobuf::Void* response,
208  google::protobuf::Closure* done) override;
209  void release_buffers(
210  mir::protobuf::BufferRelease const* request,
211  mir::protobuf::Void* response,
212  google::protobuf::Closure* done) override;
213  void request_persistent_surface_id(
214  mir::protobuf::SurfaceId const* request,
215  mir::protobuf::PersistentSurfaceId* response,
216  google::protobuf::Closure* done) override;
217  void pong(
218  mir::protobuf::PingEvent const* request,
219  mir::protobuf::Void* response,
220  google::protobuf::Closure* done) override;
221  void configure_buffer_stream(
222  mir::protobuf::StreamConfiguration const* request,
223  mir::protobuf::Void*,
224  google::protobuf::Closure* done) override;
225  void raise_surface(
226  mir::protobuf::RaiseRequest const* request,
227  mir::protobuf::Void*,
228  google::protobuf::Closure* done) override;
229 
230  // TODO: Split this into a separate thing
231  void translate_surface_to_screen(
232  mir::protobuf::CoordinateTranslationRequest const* request,
233  mir::protobuf::CoordinateTranslationResponse* response,
234  google::protobuf::Closure* done) override;
235 
236 private:
237  void pack_protobuf_buffer(protobuf::Buffer& protobuf_buffer,
238  graphics::Buffer* graphics_buffer,
239  graphics::BufferIpcMsgType msg_type);
240 
241  void advance_buffer(
242  BufferStreamId surf_id,
243  BufferStream& buffer_stream,
244  graphics::Buffer* old_buffer,
245  std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete);
246 
247  std::shared_ptr<graphics::DisplayConfiguration> unpack_and_sanitize_display_configuration(
248  protobuf::DisplayConfiguration const*);
249 
250  virtual std::function<void(std::shared_ptr<Session> const&)> prompt_session_connect_handler() const;
251 
252  void destroy_screencast_sessions();
253 
254  pid_t client_pid_;
255  std::shared_ptr<Shell> const shell;
256  std::shared_ptr<graphics::PlatformIpcOperations> const ipc_operations;
257 
258  std::vector<MirPixelFormat> const surface_pixel_formats;
259 
260  std::shared_ptr<frontend::DisplayChanger> const display_changer;
261  std::shared_ptr<SessionMediatorReport> const report;
262  std::shared_ptr<EventSinkFactory> const sink_factory;
263  std::shared_ptr<EventSink> const event_sink;
264  std::shared_ptr<MessageSender> const message_sender;
265  std::shared_ptr<MessageResourceCache> const resource_cache;
266  std::shared_ptr<Screencast> const screencast;
267  ConnectionContext const connection_context;
268  std::shared_ptr<input::CursorImages> const cursor_images;
269  std::shared_ptr<scene::CoordinateTranslator> const translator;
270  std::shared_ptr<scene::ApplicationNotRespondingDetector> const anr_detector;
271  std::shared_ptr<cookie::Authority> const cookie_authority;
272  std::shared_ptr<input::InputDeviceHub> const hub;
273 
274  BufferStreamTracker buffer_stream_tracker;
275  ScreencastBufferTracker screencast_buffer_tracker;
276 
277  std::weak_ptr<Session> weak_session;
278  std::weak_ptr<PromptSession> weak_prompt_session;
279 };
280 
281 }
282 }
283 
284 #endif /* MIR_FRONTEND_SESSION_MEDIATOR_H_ */
All things Mir.
Definition: atomic_callback.h:25
IntWrapper< detail::SessionsSurfaceIdTag > SurfaceId
Definition: surface_id.h:29
IntWrapper< detail::SessionsBufferStreamIdTag > BufferStreamId
Definition: buffer_stream_id.h:29
BufferIpcMsgType
Definition: platform_ipc_operations.h:29
SessionMediator relays requests from the client process into the server.
Definition: session_mediator.h:91
Definition: display_server_debug.h:28
Definition: buffer_stream_tracker.h:40
Definition: connection_context.h:32
Responsible for tracking what buffers the client library knows about for a given screencast id...
Definition: screencast_buffer_tracker.h:38
void configure_cursor(MirSurface *surface, unsigned int cursor_index)
Definition: cursors_demo_client.c:29
Definition: buffer_stream.h:42
Definition: buffer.h:44
Definition: display_server.h:30

Copyright © 2012-2015 Canonical Ltd.
Generated on Thu Sep 8 14:50:19 UTC 2016