summaryrefslogtreecommitdiff
path: root/server_communication.c
diff options
context:
space:
mode:
Diffstat (limited to 'server_communication.c')
-rw-r--r--server_communication.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/server_communication.c b/server_communication.c
index cc37cde..ffe6942 100644
--- a/server_communication.c
+++ b/server_communication.c
@@ -110,3 +110,108 @@ gchar **server_list(struct server *server, const gchar *directory) {
return data;
}
+
+/* TODO: remove temporary function */
+static GSocket *server_connect_port(struct server *server, gushort port) {
+ GError *error = NULL, *conn_error = NULL;
+ GSocketConnectable *addr;
+ GSocketAddressEnumerator *enumerator;
+ GSocketAddress *sockaddr;
+ GSocketConnection *conn = NULL;
+ GSocketClient *client;
+
+ addr = g_network_address_new(server->host, port);
+ enumerator = g_socket_connectable_enumerate(addr);
+ g_object_unref(addr);
+
+ client = g_socket_client_new();
+
+ while(conn == NULL && (sockaddr = g_socket_address_enumerator_next(enumerator, NULL, &error))) {
+ conn = g_socket_client_connect(client, (GSocketConnectable*)sockaddr, NULL, &conn_error);
+ g_object_unref(sockaddr);
+ }
+
+ if(sockaddr == NULL) {
+ if(error != NULL) {
+ g_warning(error->message);
+ g_error_free(error);
+ } else {
+ g_warning("server_connect: no connectable addresses found for host %s",
+ server->host);
+ }
+ return NULL;
+ }
+
+ if(conn == NULL) {
+ g_warning(conn_error->message);
+ g_error_free(conn_error);
+ return NULL;
+ }
+
+ GSocket *socket = g_socket_connection_get_socket(conn);
+
+ g_debug("connected");
+
+ return socket;
+}
+
+gboolean server_get(struct server *server, const gchar *type,
+ const gchar *localfile, const gchar *remotefile) {
+ GError *error = NULL;
+ GSocket *socket = server_connect_port(server, 8000);
+
+ if(socket == NULL) {
+ return FALSE;
+ }
+
+ gchar *cmd = g_strdup_printf("GET /get_%s %s HTTP/1.1\r\n\r\n", type, remotefile);
+
+ g_socket_send(socket, cmd, strlen(cmd), NULL, NULL);
+
+ GSocketConnection *connection = g_socket_connection_factory_create_connection(socket);
+ GDataInputStream *input = g_data_input_stream_new(g_io_stream_get_input_stream((GIOStream*)connection));
+ g_data_input_stream_set_newline_type(input, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
+
+ gchar *line = NULL;
+ gsize size;
+
+ while((line = g_data_input_stream_read_line(input, &size, NULL, &error)) != NULL) {
+ g_debug(line);
+ if(size == 0) {
+ break;
+ }
+ }
+
+ if(error != NULL) {
+ g_warning(error->message);
+ g_error_free(error);
+ return FALSE;
+ }
+
+ GFile *file = g_file_new_for_path(localfile);
+ GFileOutputStream *output = g_file_replace(file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error);
+
+ if(output == NULL) {
+ g_warning(error->message);
+ g_error_free(error);
+ return FALSE;
+ }
+
+ g_output_stream_splice((GOutputStream*)output, (GInputStream*)input,
+ G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
+ NULL, &error);
+
+ g_object_unref(input);
+ g_object_unref(output);
+ g_object_unref(file);
+
+ if(error != NULL) {
+ g_warning(error->message);
+ g_error_free(error);
+ return FALSE;
+ }
+
+ g_object_unref(connection);
+
+ return TRUE;
+}