aboutsummaryrefslogtreecommitdiff
path: root/dbus/server/dbus_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'dbus/server/dbus_server.c')
-rw-r--r--dbus/server/dbus_server.c175
1 files changed, 0 insertions, 175 deletions
diff --git a/dbus/server/dbus_server.c b/dbus/server/dbus_server.c
deleted file mode 100644
index bde6acb..0000000
--- a/dbus/server/dbus_server.c
+++ /dev/null
@@ -1,175 +0,0 @@
-#include "../dbus_impl.h"
-#include "../protocol.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <unistd.h>
-#include <sys/socket.h>
-
-/* TODO: Error check write/read */
-
-static int handle_create_session(gsr_dbus *dbus, int rpc_fd, const gsr_dbus_message_req_create_session *create_session) {
- (void)create_session;
- char *session_handle = NULL;
- const int status = gsr_dbus_screencast_create_session(dbus, &session_handle);
- if(status == 0) {
- gsr_dbus_response_message response = {
- .protocol_version = GSR_DBUS_PROTOCOL_VERSION,
- .type = GSR_DBUS_MESSAGE_RESP_CREATE_SESSION,
- .create_session = (gsr_dbus_message_resp_create_session) {}
- };
- snprintf(response.create_session.session_handle, sizeof(response.create_session.session_handle), "%s", session_handle);
- free(session_handle);
- write(rpc_fd, &response, sizeof(response));
- }
- return status;
-}
-
-static int handle_select_sources(gsr_dbus *dbus, int rpc_fd, const gsr_dbus_message_req_select_sources *select_sources) {
- const int status = gsr_dbus_screencast_select_sources(dbus, select_sources->session_handle, select_sources->capture_type, select_sources->cursor_mode);
- if(status == 0) {
- gsr_dbus_response_message response = {
- .protocol_version = GSR_DBUS_PROTOCOL_VERSION,
- .type = GSR_DBUS_MESSAGE_RESP_SELECT_SOURCES,
- .select_sources = (gsr_dbus_message_resp_select_sources) {}
- };
- write(rpc_fd, &response, sizeof(response));
- }
- return status;
-}
-
-static int handle_start(gsr_dbus *dbus, int rpc_fd, const gsr_dbus_message_req_start *start) {
- uint32_t pipewire_node = 0;
- const int status = gsr_dbus_screencast_start(dbus, start->session_handle, &pipewire_node);
- if(status == 0) {
- const char *screencast_restore_token = gsr_dbus_screencast_get_restore_token(dbus);
- gsr_dbus_response_message response = {
- .protocol_version = GSR_DBUS_PROTOCOL_VERSION,
- .type = GSR_DBUS_MESSAGE_RESP_START,
- .start = (gsr_dbus_message_resp_start) {
- .pipewire_node = pipewire_node
- }
- };
- snprintf(response.start.restore_token, sizeof(response.start.restore_token), "%s", screencast_restore_token ? screencast_restore_token : "");
- write(rpc_fd, &response, sizeof(response));
- }
- return status;
-}
-
-static bool handle_open_pipewire_remote(gsr_dbus *dbus, int rpc_fd, const gsr_dbus_message_req_open_pipewire_remote *open_pipewire_remote) {
- int pipewire_fd = 0;
- const bool success = gsr_dbus_screencast_open_pipewire_remote(dbus, open_pipewire_remote->session_handle, &pipewire_fd);
- if(success) {
- gsr_dbus_response_message response = {
- .protocol_version = GSR_DBUS_PROTOCOL_VERSION,
- .type = GSR_DBUS_MESSAGE_RESP_OPEN_PIPEWIRE_REMOTE,
- .open_pipewire_remote = (gsr_dbus_message_resp_open_pipewire_remote) {}
- };
-
- struct iovec iov = {
- .iov_base = &response,
- .iov_len = sizeof(response)
- };
-
- char msg_control[CMSG_SPACE(sizeof(int))];
-
- struct msghdr message = {
- .msg_iov = &iov,
- .msg_iovlen = 1,
- .msg_control = msg_control,
- .msg_controllen = sizeof(msg_control)
- };
-
- struct cmsghdr *cmsg = CMSG_FIRSTHDR(&message);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
- int *fds = (int*)CMSG_DATA(cmsg);
- fds[0] = pipewire_fd;
- message.msg_controllen = cmsg->cmsg_len;
- sendmsg(rpc_fd, &message, 0);
- }
- return success;
-}
-
-int main(int argc, char **argv) {
- if(argc != 3) {
- fprintf(stderr, "usage: gsr-dbus-server <rpc-fd> <screencast-restore-token>\n");
- return 1;
- }
-
- const char *rpc_fd_str = argv[1];
- const char *screencast_restore_token = argv[2];
-
- int rpc_fd = -1;
- if(sscanf(rpc_fd_str, "%d", &rpc_fd) != 1) {
- fprintf(stderr, "gsr-dbus-server error: rpc-fd is not a number: %s\n", rpc_fd_str);
- return 1;
- }
-
- if(screencast_restore_token[0] == '\0')
- screencast_restore_token = NULL;
-
- gsr_dbus dbus;
- if(!gsr_dbus_init(&dbus, screencast_restore_token))
- return 1;
-
- /* Tell client we have started up */
- write(rpc_fd, "S", 1);
-
- gsr_dbus_request_message request;
- for(;;) {
- read(rpc_fd, &request, sizeof(request));
-
- if(request.protocol_version != GSR_DBUS_PROTOCOL_VERSION) {
- gsr_dbus_response_message response = {
- .protocol_version = GSR_DBUS_PROTOCOL_VERSION,
- .type = GSR_DBUS_MESSAGE_RESP_ERROR,
- .error = (gsr_dbus_message_resp_error) {
- .error_code = 1
- }
- };
- snprintf(response.error.message, sizeof(response.error.message), "Client uses protocol version %d while the server is using protocol version %d", request.protocol_version, GSR_DBUS_PROTOCOL_VERSION);
- fprintf(stderr, "gsr-dbus-server error: %s\n", response.error.message);
- write(rpc_fd, &response, sizeof(response));
- continue;
- }
-
- int status = 0;
- switch(request.type) {
- case GSR_DBUS_MESSAGE_REQ_CREATE_SESSION: {
- status = handle_create_session(&dbus, rpc_fd, &request.create_session);
- break;
- }
- case GSR_DBUS_MESSAGE_REQ_SELECT_SOURCES: {
- status = handle_select_sources(&dbus, rpc_fd, &request.select_sources);
- break;
- }
- case GSR_DBUS_MESSAGE_REQ_START: {
- status = handle_start(&dbus, rpc_fd, &request.start);
- break;
- }
- case GSR_DBUS_MESSAGE_REQ_OPEN_PIPEWIRE_REMOTE: {
- if(!handle_open_pipewire_remote(&dbus, rpc_fd, &request.open_pipewire_remote))
- status = -1;
- break;
- }
- }
-
- if(status != 0) {
- gsr_dbus_response_message response = {
- .protocol_version = GSR_DBUS_PROTOCOL_VERSION,
- .type = GSR_DBUS_MESSAGE_RESP_ERROR,
- .error = (gsr_dbus_message_resp_error) {
- .error_code = status
- }
- };
- snprintf(response.error.message, sizeof(response.error.message), "%s", "Failed to handle request");
- write(rpc_fd, &response, sizeof(response));
- }
- }
-
- gsr_dbus_deinit(&dbus);
- return 0;
-} \ No newline at end of file