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 graphics
42 {
43 class Buffer;
44 class Display;
45 class GraphicBufferAllocator;
46 }
47 namespace input
48 {
49 class CursorImages;
50 }
51 
52 namespace scene
53 {
54 class CoordinateTranslator;
55 class ApplicationNotRespondingDetector;
56 }
57 
60 namespace frontend
61 {
62 class ClientBufferTracker;
63 class Shell;
64 class Session;
65 class Surface;
66 class MessageResourceCache;
67 class SessionMediatorReport;
68 class EventSink;
69 class EventSinkFactory;
70 class MessageSender;
71 class DisplayChanger;
72 class Screencast;
73 class PromptSession;
74 class BufferStream;
75 
86 {
87 public:
88 
90  std::shared_ptr<Shell> const& shell,
91  std::shared_ptr<graphics::PlatformIpcOperations> const& ipc_operations,
92  std::shared_ptr<frontend::DisplayChanger> const& display_changer,
93  std::vector<MirPixelFormat> const& surface_pixel_formats,
94  std::shared_ptr<SessionMediatorReport> const& report,
95  std::shared_ptr<EventSinkFactory> const& sink_factory,
96  std::shared_ptr<MessageSender> const& message_sender,
97  std::shared_ptr<MessageResourceCache> const& resource_cache,
98  std::shared_ptr<Screencast> const& screencast,
99  ConnectionContext const& connection_context,
100  std::shared_ptr<input::CursorImages> const& cursor_images,
101  std::shared_ptr<scene::CoordinateTranslator> const& translator,
102  std::shared_ptr<scene::ApplicationNotRespondingDetector> const& anr_detector);
103 
104  ~SessionMediator() noexcept;
105 
106  void client_pid(int pid) override;
107 
108  void connect(
109  mir::protobuf::ConnectParameters const* request,
110  mir::protobuf::Connection* response,
111  google::protobuf::Closure* done) override;
112  void disconnect(
113  mir::protobuf::Void const* request,
114  mir::protobuf::Void* response,
115  google::protobuf::Closure* done) override;
116  void create_surface(
117  mir::protobuf::SurfaceParameters const* request,
118  mir::protobuf::Surface* response,
119  google::protobuf::Closure* done) override;
120  void modify_surface(
121  mir::protobuf::SurfaceModifications const* request,
122  mir::protobuf::Void* response,
123  google::protobuf::Closure* done) override;
124  void next_buffer(
125  mir::protobuf::SurfaceId const* request,
126  mir::protobuf::Buffer* response,
127  google::protobuf::Closure* done) override;
128  void release_surface(
129  mir::protobuf::SurfaceId const* request,
130  mir::protobuf::Void* response,
131  google::protobuf::Closure* done) override;
132  void platform_operation(
133  mir::protobuf::PlatformOperationMessage const* request,
134  mir::protobuf::PlatformOperationMessage* response,
135  google::protobuf::Closure* done) override;
136  void configure_surface(
137  mir::protobuf::SurfaceSetting const* request,
138  mir::protobuf::SurfaceSetting* response,
139  google::protobuf::Closure* done) override;
140  void configure_display(
141  mir::protobuf::DisplayConfiguration const* request,
142  mir::protobuf::DisplayConfiguration* response,
143  google::protobuf::Closure* done) override;
144  void create_screencast(
145  mir::protobuf::ScreencastParameters const* request,
146  mir::protobuf::Screencast* response,
147  google::protobuf::Closure* done) override;
148  void screencast_buffer(
149  mir::protobuf::ScreencastId const* request,
150  mir::protobuf::Buffer* response,
151  google::protobuf::Closure* done) override;
152  void release_screencast(
153  mir::protobuf::ScreencastId const* request,
154  mir::protobuf::Void* response,
155  google::protobuf::Closure* done) override;
157  mir::protobuf::BufferStreamParameters const* request,
158  mir::protobuf::BufferStream* response,
159  google::protobuf::Closure* done) override;
161  mir::protobuf::BufferStreamId const* request,
162  mir::protobuf::Void* response,
163  google::protobuf::Closure* done) override;
164  void configure_cursor(
165  mir::protobuf::CursorSetting const* request,
166  mir::protobuf::Void* response,
167  google::protobuf::Closure* done) override;
169  mir::protobuf::SocketFDRequest const* request,
170  mir::protobuf::SocketFD* response,
171  google::protobuf::Closure* done) override;
173  mir::protobuf::PromptSessionParameters const* request,
174  mir::protobuf::Void* response,
175  google::protobuf::Closure* done) override;
176  void stop_prompt_session(
177  mir::protobuf::Void const* request,
178  mir::protobuf::Void* response,
179  google::protobuf::Closure* done) override;
180  void exchange_buffer(
181  mir::protobuf::BufferRequest const* request,
182  mir::protobuf::Buffer* response,
183  google::protobuf::Closure* done) override;
184  void submit_buffer(
185  mir::protobuf::BufferRequest const* request,
186  mir::protobuf::Void* response,
187  google::protobuf::Closure* done) override;
188  void allocate_buffers(
189  mir::protobuf::BufferAllocation const* request,
190  mir::protobuf::Void* response,
191  google::protobuf::Closure* done) override;
192  void release_buffers(
193  mir::protobuf::BufferRelease const* request,
194  mir::protobuf::Void* response,
195  google::protobuf::Closure* done) override;
197  mir::protobuf::SurfaceId const* request,
198  mir::protobuf::PersistentSurfaceId* response,
199  google::protobuf::Closure* done) override;
200  void pong(
201  mir::protobuf::PingEvent const* request,
202  mir::protobuf::Void* response,
203  google::protobuf::Closure* done) override;
205  mir::protobuf::StreamConfiguration const* request,
206  mir::protobuf::Void*,
207  google::protobuf::Closure* done) override;
208 
209  // TODO: Split this into a separate thing
211  mir::protobuf::CoordinateTranslationRequest const* request,
212  mir::protobuf::CoordinateTranslationResponse* response,
213  google::protobuf::Closure* done) override;
214 
215 private:
216  void pack_protobuf_buffer(protobuf::Buffer& protobuf_buffer,
217  graphics::Buffer* graphics_buffer,
218  graphics::BufferIpcMsgType msg_type);
219 
220  void advance_buffer(
221  BufferStreamId surf_id,
222  BufferStream& buffer_stream,
223  graphics::Buffer* old_buffer,
224  std::function<void(graphics::Buffer*, graphics::BufferIpcMsgType)> complete);
225 
226  virtual std::function<void(std::shared_ptr<Session> const&)> prompt_session_connect_handler() const;
227 
228  pid_t client_pid_;
229  std::shared_ptr<Shell> const shell;
230  std::shared_ptr<graphics::PlatformIpcOperations> const ipc_operations;
231 
232  std::vector<MirPixelFormat> const surface_pixel_formats;
233 
234  std::shared_ptr<frontend::DisplayChanger> const display_changer;
235  std::shared_ptr<SessionMediatorReport> const report;
236  std::shared_ptr<EventSinkFactory> const sink_factory;
237  std::shared_ptr<EventSink> const event_sink;
238  std::shared_ptr<MessageSender> const message_sender;
239  std::shared_ptr<MessageResourceCache> const resource_cache;
240  std::shared_ptr<Screencast> const screencast;
241  ConnectionContext const connection_context;
242  std::shared_ptr<input::CursorImages> const cursor_images;
243  std::shared_ptr<scene::CoordinateTranslator> const translator;
244  std::shared_ptr<scene::ApplicationNotRespondingDetector> const anr_detector;
245 
246  BufferStreamTracker buffer_stream_tracker;
247 
248  std::weak_ptr<Session> weak_session;
249  std::weak_ptr<PromptSession> weak_prompt_session;
250 };
251 
252 }
253 }
254 
255 #endif /* MIR_FRONTEND_SESSION_MEDIATOR_H_ */
All things Mir.
Definition: atomic_callback.h:25
IntWrapper< detail::SessionsSurfaceIdTag > SurfaceId
Definition: surface_id.h:29
void submit_buffer(mir::protobuf::BufferRequest const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:371
void pong(mir::protobuf::PingEvent const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:847
IntWrapper< detail::SessionsBufferStreamIdTag > BufferStreamId
Definition: buffer_stream_id.h:29
BufferIpcMsgType
Definition: platform_ipc_operations.h:29
void release_buffers(mir::protobuf::BufferRelease const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:433
void screencast_buffer(mir::protobuf::ScreencastId const *request, mir::protobuf::Buffer *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:680
SessionMediator relays requests from the client process into the server.
Definition: session_mediator.h:85
SessionMediator(std::shared_ptr< Shell > const &shell, std::shared_ptr< graphics::PlatformIpcOperations > const &ipc_operations, std::shared_ptr< frontend::DisplayChanger > const &display_changer, std::vector< MirPixelFormat > const &surface_pixel_formats, std::shared_ptr< SessionMediatorReport > const &report, std::shared_ptr< EventSinkFactory > const &sink_factory, std::shared_ptr< MessageSender > const &message_sender, std::shared_ptr< MessageResourceCache > const &resource_cache, std::shared_ptr< Screencast > const &screencast, ConnectionContext const &connection_context, std::shared_ptr< input::CursorImages > const &cursor_images, std::shared_ptr< scene::CoordinateTranslator > const &translator, std::shared_ptr< scene::ApplicationNotRespondingDetector > const &anr_detector)
Definition: session_mediator.cpp:76
void create_buffer_stream(mir::protobuf::BufferStreamParameters const *request, mir::protobuf::BufferStream *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:698
void client_pid(int pid) override
Definition: session_mediator.cpp:118
Definition: display_server_debug.h:28
~SessionMediator() noexcept
Definition: session_mediator.cpp:109
Definition: buffer_stream_tracker.h:38
void request_persistent_surface_id(mir::protobuf::SurfaceId const *request, mir::protobuf::PersistentSurfaceId *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:961
void translate_surface_to_screen(mir::protobuf::CoordinateTranslationRequest const *request, mir::protobuf::CoordinateTranslationResponse *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:861
void disconnect(mir::protobuf::Void const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:471
Definition: connection_context.h:32
void next_buffer(mir::protobuf::SurfaceId const *request, mir::protobuf::Buffer *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:316
void modify_surface(mir::protobuf::SurfaceModifications const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:516
void allocate_buffers(mir::protobuf::BufferAllocation const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:409
void configure_surface(mir::protobuf::SurfaceSetting const *request, mir::protobuf::SurfaceSetting *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:489
void release_surface(mir::protobuf::SurfaceId const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:450
Definition: buffer_stream.h:42
void stop_prompt_session(mir::protobuf::Void const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:937
void release_buffer_stream(mir::protobuf::BufferStreamId const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:739
void exchange_buffer(mir::protobuf::BufferRequest const *request, mir::protobuf::Buffer *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:343
void release_screencast(mir::protobuf::ScreencastId const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:669
Definition: buffer.h:44
void platform_operation(mir::protobuf::PlatformOperationMessage const *request, mir::protobuf::PlatformOperationMessage *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:883
void configure_buffer_stream(mir::protobuf::StreamConfiguration const *request, mir::protobuf::Void *, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:992
void start_prompt_session(mir::protobuf::PromptSessionParameters const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:914
void create_screencast(mir::protobuf::ScreencastParameters const *request, mir::protobuf::Screencast *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:640
void configure_cursor(mir::protobuf::CursorSetting const *request, mir::protobuf::Void *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:781
void connect(mir::protobuf::ConnectParameters const *request, mir::protobuf::Connection *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:123
void configure_display(mir::protobuf::DisplayConfiguration const *request, mir::protobuf::DisplayConfiguration *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:597
void create_surface(mir::protobuf::SurfaceParameters const *request, mir::protobuf::Surface *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:193
Definition: display_server.h:30
void new_fds_for_prompt_providers(mir::protobuf::SocketFDRequest const *request, mir::protobuf::SocketFD *response, google::protobuf::Closure *done) override
Definition: session_mediator.cpp:819

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