summaryrefslogtreecommitdiff
path: root/Userland/Services/Clipboard
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Services/Clipboard')
-rw-r--r--Userland/Services/Clipboard/ClientConnection.cpp27
-rw-r--r--Userland/Services/Clipboard/ClientConnection.h2
-rw-r--r--Userland/Services/Clipboard/ClipboardServer.ipc4
-rw-r--r--Userland/Services/Clipboard/Storage.cpp10
-rw-r--r--Userland/Services/Clipboard/Storage.h12
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;
};