diff options
Diffstat (limited to 'Userland/Services/Clipboard')
-rw-r--r-- | Userland/Services/Clipboard/ClientConnection.cpp | 27 | ||||
-rw-r--r-- | Userland/Services/Clipboard/ClientConnection.h | 2 | ||||
-rw-r--r-- | Userland/Services/Clipboard/ClipboardServer.ipc | 4 | ||||
-rw-r--r-- | Userland/Services/Clipboard/Storage.cpp | 10 | ||||
-rw-r--r-- | Userland/Services/Clipboard/Storage.h | 12 |
5 files changed, 14 insertions, 41 deletions
diff --git a/Userland/Services/Clipboard/ClientConnection.cpp b/Userland/Services/Clipboard/ClientConnection.cpp index 9518a4f0b6..86ecba3616 100644 --- a/Userland/Services/Clipboard/ClientConnection.cpp +++ b/Userland/Services/Clipboard/ClientConnection.cpp @@ -25,7 +25,6 @@ */ #include <AK/Badge.h> -#include <AK/SharedBuffer.h> #include <Clipboard/ClientConnection.h> #include <Clipboard/ClipboardClientEndpoint.h> #include <Clipboard/Storage.h> @@ -63,36 +62,14 @@ OwnPtr<Messages::ClipboardServer::GreetResponse> ClientConnection::handle(const OwnPtr<Messages::ClipboardServer::SetClipboardDataResponse> ClientConnection::handle(const Messages::ClipboardServer::SetClipboardData& message) { - auto shared_buffer = SharedBuffer::create_from_shbuf_id(message.shbuf_id()); - if (!shared_buffer) { - did_misbehave("SetClipboardData: Bad shared buffer ID"); - return {}; - } - Storage::the().set_data(*shared_buffer, message.data_size(), message.mime_type(), message.metadata().entries()); + Storage::the().set_data(message.data(), message.mime_type(), message.metadata().entries()); return make<Messages::ClipboardServer::SetClipboardDataResponse>(); } OwnPtr<Messages::ClipboardServer::GetClipboardDataResponse> ClientConnection::handle(const Messages::ClipboardServer::GetClipboardData&) { auto& storage = Storage::the(); - - i32 shbuf_id = -1; - if (storage.data_size()) { - // FIXME: Optimize case where an app is copy/pasting within itself. - // We can just reuse the SharedBuffer then, since it will have the same peer PID. - // It would be even nicer if a SharedBuffer could have an arbitrary number of clients.. - RefPtr<SharedBuffer> shared_buffer = SharedBuffer::create_with_size(storage.data_size()); - ASSERT(shared_buffer); - memcpy(shared_buffer->data<void>(), storage.data(), storage.data_size()); - shared_buffer->seal(); - shared_buffer->share_with(client_pid()); - shbuf_id = shared_buffer->shbuf_id(); - - // FIXME: This is a workaround for the fact that SharedBuffers will go away if neither side is retaining them. - // After we respond to GetClipboardData, we have to wait for the client to ref the buffer on his side. - m_last_sent_buffer = move(shared_buffer); - } - return make<Messages::ClipboardServer::GetClipboardDataResponse>(shbuf_id, storage.data_size(), storage.mime_type(), storage.metadata()); + return make<Messages::ClipboardServer::GetClipboardDataResponse>(storage.buffer(), storage.mime_type(), storage.metadata()); } void ClientConnection::notify_about_clipboard_change() diff --git a/Userland/Services/Clipboard/ClientConnection.h b/Userland/Services/Clipboard/ClientConnection.h index 48794f4f88..fa57cc3372 100644 --- a/Userland/Services/Clipboard/ClientConnection.h +++ b/Userland/Services/Clipboard/ClientConnection.h @@ -53,8 +53,6 @@ private: virtual OwnPtr<Messages::ClipboardServer::GreetResponse> handle(const Messages::ClipboardServer::Greet&) override; virtual OwnPtr<Messages::ClipboardServer::GetClipboardDataResponse> handle(const Messages::ClipboardServer::GetClipboardData&) override; virtual OwnPtr<Messages::ClipboardServer::SetClipboardDataResponse> handle(const Messages::ClipboardServer::SetClipboardData&) override; - - RefPtr<SharedBuffer> m_last_sent_buffer; }; } diff --git a/Userland/Services/Clipboard/ClipboardServer.ipc b/Userland/Services/Clipboard/ClipboardServer.ipc index c0c1fab8c8..2b38fc16fe 100644 --- a/Userland/Services/Clipboard/ClipboardServer.ipc +++ b/Userland/Services/Clipboard/ClipboardServer.ipc @@ -2,6 +2,6 @@ endpoint ClipboardServer = 802 { Greet() => (i32 client_id) - GetClipboardData() => (i32 shbuf_id, i32 data_size, [UTF8] String mime_type, IPC::Dictionary metadata) - SetClipboardData(i32 shbuf_id, i32 data_size, [UTF8] String mime_type, IPC::Dictionary metadata) => () + GetClipboardData() => (Core::AnonymousBuffer data, [UTF8] String mime_type, IPC::Dictionary metadata) + SetClipboardData(Core::AnonymousBuffer data, [UTF8] String mime_type, IPC::Dictionary metadata) => () } diff --git a/Userland/Services/Clipboard/Storage.cpp b/Userland/Services/Clipboard/Storage.cpp index 3b745dea16..b26727c1f1 100644 --- a/Userland/Services/Clipboard/Storage.cpp +++ b/Userland/Services/Clipboard/Storage.cpp @@ -44,14 +44,10 @@ Storage::~Storage() { } -void Storage::set_data(NonnullRefPtr<SharedBuffer> data, size_t data_size, const String& mime_type, const HashMap<String, String>& metadata) +void Storage::set_data(Core::AnonymousBuffer data, const String& mime_type, const HashMap<String, String>& metadata) { - dbg() << "Storage::set_data <- [" << mime_type << "] " << data->data<void>() << " (" << data_size << " bytes)"; - for (auto& it : metadata) { - dbg() << " " << it.key << ": " << it.value; - } - m_shared_buffer = move(data); - m_data_size = data_size; + m_buffer = move(data); + m_data_size = data.size(); m_mime_type = mime_type; m_metadata = metadata; diff --git a/Userland/Services/Clipboard/Storage.h b/Userland/Services/Clipboard/Storage.h index ce194c15f4..82f7408fda 100644 --- a/Userland/Services/Clipboard/Storage.h +++ b/Userland/Services/Clipboard/Storage.h @@ -28,8 +28,8 @@ #include <AK/Function.h> #include <AK/HashMap.h> -#include <AK/SharedBuffer.h> #include <AK/String.h> +#include <LibCore/AnonymousBuffer.h> namespace Clipboard { @@ -38,7 +38,7 @@ public: static Storage& the(); ~Storage(); - bool has_data() const { return m_shared_buffer; } + bool has_data() const { return m_buffer.is_valid(); } const String& mime_type() const { return m_mime_type; } const HashMap<String, String>& metadata() const { return m_metadata; } @@ -47,7 +47,7 @@ public: { if (!has_data()) return nullptr; - return m_shared_buffer->data<u8>(); + return m_buffer.data<u8>(); } size_t data_size() const @@ -57,15 +57,17 @@ public: return 0; } - void set_data(NonnullRefPtr<SharedBuffer>, size_t data_size, const String& mime_type, const HashMap<String, String>& metadata); + void set_data(Core::AnonymousBuffer, const String& mime_type, const HashMap<String, String>& metadata); Function<void()> on_content_change; + const Core::AnonymousBuffer& buffer() const { return m_buffer; } + private: Storage(); String m_mime_type; - RefPtr<SharedBuffer> m_shared_buffer; + Core::AnonymousBuffer m_buffer; size_t m_data_size { 0 }; HashMap<String, String> m_metadata; }; |