/** * Function that gets the data of a specific hash * @param server_struct is the main structure for the server. * @param hash is the hash (in hex format) of which we want the data. * @returns a json formatted string. */ static gchar *get_data_from_a_specific_hash(server_struct_t *server_struct, gchar *hash) { gchar *answer = NULL; backend_t *backend = NULL; hash_data_t *hash_data = NULL; if (server_struct != NULL && server_struct->backend != NULL) { backend = server_struct->backend; if (backend->retrieve_data != NULL) { hash_data = backend->retrieve_data(server_struct, hash); answer = convert_hash_data_t_to_string(hash_data); free_hash_data_t(hash_data); if (answer == NULL) { answer = g_strdup_printf("Error while trying to get data from hash %s", hash); } } else { answer = g_strdup(_("This backend's missing a retrieve_data function!")); } } else { answer = g_strdup(_("Something's wrong with server's initialisation!")); } return answer; }
/** * Gets all data from a list of hash obtained from X-Get-Hash-Array HTTP * header. * @param server_struct is the main structure for the server. * @param connection is the connection in MHD * @returns a newlly allocated gchar * string that contains the anwser to be * sent back to the client (hopefully a json string containing * a hash (that is a fake one here), data and size of the data. */ static gchar *get_data_from_a_list_of_hashs(server_struct_t *server_struct, struct MHD_Connection *connection) { const char *header = NULL; gchar *answer = NULL; gchar *hash = NULL; GList *head = NULL; GList *header_hdl = NULL; GList *hash_data_list = NULL; hash_data_t *header_hd = NULL; hash_data_t *hash_data = NULL; backend_t *backend = server_struct->backend; guint size = 0; header = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, "X-Get-Hash-Array"); header_hdl = make_hash_data_list_from_string((gchar *)header); head = header_hdl; while (header_hdl != NULL) { header_hd = header_hdl->data; hash = hash_to_string(header_hd->hash); hash_data = backend->retrieve_data(server_struct, hash); free_variable(hash); size = size + hash_data->read; hash_data_list = g_list_prepend(hash_data_list, hash_data); header_hdl = g_list_next(header_hdl); } g_list_free_full(head, free_hdt_struct); hash_data_list = g_list_reverse(hash_data_list); head = hash_data_list; hash_data = create_one_hash_data_t_from_hash_data_list(hash_data_list, size); g_list_free_full(head, free_hdt_struct); answer = convert_hash_data_t_to_string(hash_data); free_hash_data_t(hash_data); return answer; }
/** * handler for g_slist_free_full * @param data must be a hash_data_t * structure. */ void free_hdt_struct(gpointer data) { free_hash_data_t(data); }