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"
24 
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 next_buffer(
134  mir::protobuf::SurfaceId const* request,
135  mir::protobuf::Buffer* response,
136  google::protobuf::Closure* done) override;
137  void release_surface(
138  mir::protobuf::SurfaceId const* request,
139  mir::protobuf::Void* response,
140  google::protobuf::Closure* done) override;
141  void platform_operation(
142  mir::protobuf::PlatformOperationMessage const* request,
143  mir::protobuf::PlatformOperationMessage* response,
144  google::protobuf::Closure* done) override;
145  void configure_surface(
146  mir::protobuf::SurfaceSetting const* request,
147  mir::protobuf::SurfaceSetting* response,
148  google::protobuf::Closure* done) override;
149  void configure_display(
150  mir::protobuf::DisplayConfiguration const* request,
151  mir::protobuf::DisplayConfiguration* response,
152  google::protobuf::Closure* done) override;
153  void set_base_display_configuration(
154  mir::protobuf::DisplayConfiguration const* request,
155  mir::protobuf::Void* response,
156  google::protobuf::Closure* done) override;
157  void create_screencast(
158  mir::protobuf::ScreencastParameters const* request,
159  mir::protobuf::Screencast* response,
160  google::protobuf::Closure* done) override;
161  void screencast_buffer(
162  mir::protobuf::ScreencastId const* request,
163  mir::protobuf::Buffer* response,
164  google::protobuf::Closure* done) override;
165  void release_screencast(
166  mir::protobuf::ScreencastId const* request,
167  mir::protobuf::Void* response,
168  google::protobuf::Closure* done) override;
169  void create_buffer_stream(
170  mir::protobuf::BufferStreamParameters const* request,
171  mir::protobuf::BufferStream* response,
172  google::protobuf::Closure* done) override;
173  void release_buffer_stream(
174  mir::protobuf::BufferStreamId const* request,
175  mir::protobuf::Void* response,
176  google::protobuf::Closure* done) override;
177  void configure_cursor(
178  mir::protobuf::CursorSetting const* request,
179  mir::protobuf::Void* response,
180  google::protobuf::Closure* done) override;
181  void new_fds_for_prompt_providers(
182  mir::protobuf::SocketFDRequest const* request,
183  mir::protobuf::SocketFD* response,
184  google::protobuf::Closure* done) override;
185  void start_prompt_session(
186  mir::protobuf::PromptSessionParameters const* request,
187  mir::protobuf::Void* response,
188  google::protobuf::Closure* done) override;
189  void stop_prompt_session(
190  mir::protobuf::Void const* request,
191  mir::protobuf::Void* response,
192  google::protobuf::Closure* done) override;
193  void exchange_buffer(
194  mir::protobuf::BufferRequest const* request,
195  mir::protobuf::Buffer* response,
196  google::protobuf::Closure* done) override;
197  void submit_buffer(
198  mir::protobuf::BufferRequest const* request,
199  mir::protobuf::Void* response,
200  google::protobuf::Closure* done) override;
201  void allocate_buffers(
202  mir::protobuf::BufferAllocation const* request,
203  mir::protobuf::Void* response,
204  google::protobuf::Closure* done) override;
205  void release_buffers(
206  mir::protobuf::BufferRelease const* request,
207  mir::protobuf::Void* response,
208  google::protobuf::Closure* done) override;
209  void request_persistent_surface_id(
210  mir::protobuf::SurfaceId const* request,
211  mir::protobuf::PersistentSurfaceId* response,
212  google::protobuf::Closure* done) override;
213  void pong(
214  mir::protobuf::PingEvent const* request,
215  mir::protobuf::Void* response,
216  google::protobuf::Closure* done) override;
217  void configure_buffer_stream(
218  mir::protobuf::StreamConfiguration const* request,
219  mir::protobuf::Void*,
220  google::protobuf::Closure* done) override;
221  void raise_surface(
222  mir::protobuf::RaiseRequest const* request,
223  mir::protobuf::Void*,
224  google::protobuf::Closure* done) override;
225 
226  // TODO: Split this into a separate thing
227  void translate_surface_to_screen(
228  mir::protobuf::CoordinateTranslationRequest const* request,
229  mir::protobuf::CoordinateTranslationResponse* response,
230  google::protobuf::Closure* done) override;
231 
232 private:
233  void pack_protobuf_buffer(protobuf::Buffer& protobuf_buffer,
234  graphics::Buffer* graphics_buffer,
235  graphics::BufferIpcMsgType msg_type);
236 
237  void advance_buffer(
238  BufferStreamId surf_id,
239  BufferStream& buffer_stream,
240  graphics::Buffer* old_buffer,
241  std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete);
242 
243  std::shared_ptr<graphics::DisplayConfiguration> unpack_and_sanitize_display_configuration(
244  protobuf::DisplayConfiguration const*);
245 
246  virtual std::function<void(std::shared_ptr<Session> const&)> prompt_session_connect_handler() const;
247 
248  pid_t client_pid_;
249  std::shared_ptr<Shell> const shell;
250  std::shared_ptr<graphics::PlatformIpcOperations> const ipc_operations;
251 
252  std::vector<MirPixelFormat> const surface_pixel_formats;
253 
254  std::shared_ptr<frontend::DisplayChanger> const display_changer;
255  std::shared_ptr<SessionMediatorReport> const report;
256  std::shared_ptr<EventSinkFactory> const sink_factory;
257  std::shared_ptr<EventSink> const event_sink;
258  std::shared_ptr<MessageSender> const message_sender;
259  std::shared_ptr<MessageResourceCache> const resource_cache;
260  std::shared_ptr<Screencast> const screencast;
261  ConnectionContext const connection_context;
262  std::shared_ptr<input::CursorImages> const cursor_images;
263  std::shared_ptr<scene::CoordinateTranslator> const translator;
264  std::shared_ptr<scene::ApplicationNotRespondingDetector> const anr_detector;
265  std::shared_ptr<cookie::Authority> const cookie_authority;
266  std::shared_ptr<input::InputDeviceHub> const hub;
267 
268  BufferStreamTracker buffer_stream_tracker;
269 
270  std::weak_ptr<Session> weak_session;
271  std::weak_ptr<PromptSession> weak_prompt_session;
272 };
273 
274 }
275 }
276 
277 #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:38
Definition: connection_context.h:32
void configure_cursor(MirSurface *surface, unsigned int cursor_index)
Definition: cursors_demo_client.c:28
Definition: buffer_stream.h:42
Definition: buffer.h:44
Definition: display_server.h:30

Copyright © 2012-2015 Canonical Ltd.
Generated on Wed Mar 30 00:29:56 UTC 2016