summaryrefslogtreecommitdiff
path: root/Userland/Services/SpiceAgent
diff options
context:
space:
mode:
authorCaoimhe <caoimhebyrne06@gmail.com>2023-05-13 19:59:37 +0100
committerAndreas Kling <kling@serenityos.org>2023-05-21 18:45:53 +0200
commitaf91c750803de47824863c88f42be692d4e9a4c2 (patch)
tree6ab661580566eddfc3afb984dfd3560fb3fb5972 /Userland/Services/SpiceAgent
parent476774d68113275c4658ae47214f6a4bb2000848 (diff)
downloadserenity-af91c750803de47824863c88f42be692d4e9a4c2.zip
SpiceAgent: Implement `FileTransferStatus` messages
Diffstat (limited to 'Userland/Services/SpiceAgent')
-rw-r--r--Userland/Services/SpiceAgent/Message.cpp26
-rw-r--r--Userland/Services/SpiceAgent/Message.h82
-rw-r--r--Userland/Services/SpiceAgent/SpiceAgent.cpp7
3 files changed, 115 insertions, 0 deletions
diff --git a/Userland/Services/SpiceAgent/Message.cpp b/Userland/Services/SpiceAgent/Message.cpp
index c6e58027a1..6bbb430e6e 100644
--- a/Userland/Services/SpiceAgent/Message.cpp
+++ b/Userland/Services/SpiceAgent/Message.cpp
@@ -241,4 +241,30 @@ ErrorOr<String> FileTransferStartMessage::debug_description()
return builder.to_string();
}
+ErrorOr<FileTransferStatusMessage> FileTransferStatusMessage::read_from_stream(AK::Stream& stream)
+{
+ auto id = TRY(stream.read_value<u32>());
+ auto status = TRY(stream.read_value<FileTransferStatus>());
+
+ return FileTransferStatusMessage(id, status);
+}
+
+ErrorOr<void> FileTransferStatusMessage::write_to_stream(AK::Stream& stream)
+{
+ TRY(stream.write_value(id()));
+ TRY(stream.write_value(status()));
+
+ return {};
+}
+
+ErrorOr<String> FileTransferStatusMessage::debug_description()
+{
+ StringBuilder builder;
+ TRY(builder.try_append("FileTransferStatus { "sv));
+ TRY(builder.try_appendff("id = {}, ", id()));
+ TRY(builder.try_appendff("status = {}", status()));
+ TRY(builder.try_append(" }"sv));
+ return builder.to_string();
+}
+
}
diff --git a/Userland/Services/SpiceAgent/Message.h b/Userland/Services/SpiceAgent/Message.h
index 01da14b7e7..3875b89195 100644
--- a/Userland/Services/SpiceAgent/Message.h
+++ b/Userland/Services/SpiceAgent/Message.h
@@ -55,6 +55,19 @@ ErrorOr<String> clipboard_data_type_to_mime_type(ClipboardDataType type);
ErrorOr<ClipboardDataType> clipboard_data_type_from_raw_value(u32 value);
ErrorOr<ClipboardDataType> clipboard_data_type_from_mime_type(String const& mime_type);
+// Used to describe what state the current file transfer is in
+enum class FileTransferStatus : u32 {
+ CanSendData = 0,
+ Cancelled,
+ Error,
+ Success,
+ NotEnoughSpace,
+ SessionLocked,
+ AgentNotConnected,
+ Disabled,
+ __End
+};
+
class Message {
public:
// The spice protocol headers contain a bit of documentation about these, but nothing major:
@@ -206,6 +219,29 @@ private:
Metadata m_metadata;
};
+// Sent/recieved to indicate the status of the current file transfer.
+class FileTransferStatusMessage : public Message {
+public:
+ FileTransferStatusMessage(u32 id, FileTransferStatus status)
+ : Message(Type::FileTransferStatus)
+ , m_id(id)
+ , m_status(status)
+ {
+ }
+
+ static ErrorOr<FileTransferStatusMessage> read_from_stream(AK::Stream& stream);
+
+ ErrorOr<void> write_to_stream(AK::Stream& stream);
+ ErrorOr<String> debug_description() override;
+
+ u32 id() const { return m_id; }
+ FileTransferStatus const& status() { return m_status; }
+
+private:
+ u32 m_id { 0 };
+ FileTransferStatus m_status;
+};
+
}
namespace AK {
@@ -246,4 +282,50 @@ struct Formatter<SpiceAgent::ClipboardDataType> : Formatter<StringView> {
return Formatter<StringView>::format(builder, string);
}
};
+
+template<>
+struct Formatter<SpiceAgent::FileTransferStatus> : Formatter<StringView> {
+ ErrorOr<void> format(FormatBuilder& builder, SpiceAgent::FileTransferStatus const& header)
+ {
+ auto string = "Unknown"sv;
+ switch (header) {
+ case SpiceAgent::FileTransferStatus::AgentNotConnected:
+ string = "AgentNotConnected"sv;
+ break;
+
+ case SpiceAgent::FileTransferStatus::Cancelled:
+ string = "Cancelled"sv;
+ break;
+
+ case SpiceAgent::FileTransferStatus::CanSendData:
+ string = "CanSendData"sv;
+ break;
+
+ case SpiceAgent::FileTransferStatus::Disabled:
+ string = "Disabled"sv;
+ break;
+
+ case SpiceAgent::FileTransferStatus::Error:
+ string = "Error"sv;
+ break;
+
+ case SpiceAgent::FileTransferStatus::NotEnoughSpace:
+ string = "NotEnoughSpace"sv;
+ break;
+
+ case SpiceAgent::FileTransferStatus::SessionLocked:
+ string = "SessionLocked"sv;
+ break;
+
+ case SpiceAgent::FileTransferStatus::Success:
+ string = "Success"sv;
+ break;
+
+ default:
+ break;
+ }
+
+ return Formatter<StringView>::format(builder, string);
+ }
+};
}
diff --git a/Userland/Services/SpiceAgent/SpiceAgent.cpp b/Userland/Services/SpiceAgent/SpiceAgent.cpp
index 788ce57a02..075f4b6c53 100644
--- a/Userland/Services/SpiceAgent/SpiceAgent.cpp
+++ b/Userland/Services/SpiceAgent/SpiceAgent.cpp
@@ -154,6 +154,13 @@ ErrorOr<void> SpiceAgent::on_message_received()
break;
}
+ case Message::Type::FileTransferStatus: {
+ auto message = TRY(FileTransferStatusMessage::read_from_stream(stream));
+ dbgln("File transfer {} has been cancelled: {}", message.id(), message.status());
+
+ break;
+ }
+
case Message::Type::FileTransferStart: {
auto message = TRY(FileTransferStartMessage::read_from_stream(stream));
dbgln("File transfer request received: {}", TRY(message.debug_description()));