From 6fd511dd41c8925e70c8e3c0ab2bcde8e1af06de Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sun, 29 Aug 2010 21:09:48 +0200 Subject: Support for fetching files via HTTP, needs more work and fixes. --- server_communication.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) (limited to 'server_communication.c') 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; +} -- cgit v1.2.3