/* $Id: glibwww-trans.cc,v 1.1.1.1 2003/07/04 22:30:08 atterer Exp $ -*- C++ -*- This code was taken from glibwww2 , main author: James Henstdridge , distributable under GPL, v2 or later. */ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ extern "C" { #include #include #include } #undef PACKAGE #undef VERSION #undef _ #include #include #include static gboolean delete_request(HTRequest */*request*/) { printf ("delete_request\n"); /*HTRequest_delete(request);*/ return FALSE; } struct LoadToFileData { gchar *url; gchar *file; GWWWLoadToFileFunc callback; gpointer user_data; }; static int after_load_to_file(HTRequest *request, HTResponse */*response*/, void *param, int status) { struct LoadToFileData *data = (struct LoadToFileData *)param; printf ("after_load_to_file\n"); /* Ignore these after events. We will get another call to the * after filter when the data actually loads. */ switch (status) { case HT_NO_ACCESS: case HT_REAUTH: case HT_PERM_REDIRECT: case HT_FOUND: case HT_SEE_OTHER: case HT_TEMP_REDIRECT: return HT_OK; default: break; } if (data) { if (data->callback) (* data->callback)(data->url, data->file, status, data->user_data); g_free(data->url); g_free(data->file); g_free(data); } /* schedule for the request to be deleted */ g_idle_add((GSourceFunc)delete_request, request); return HT_OK; } GWWWRequest * glibwww_load_to_file(const gchar *url, const gchar *file, GWWWLoadToFileFunc callback, gpointer user_data) { FILE *fp; HTRequest *request; HTStream *writer; struct LoadToFileData *data; g_return_val_if_fail(url != NULL, NULL); g_return_val_if_fail(file != NULL, NULL); if ((fp = fopen(file, "wb")) == NULL) return NULL; request = HTRequest_new(); writer = HTFWriter_new(request, fp, NO); HTRequest_setOutputFormat(request, WWW_SOURCE); HTRequest_setOutputStream(request, writer); HTRequest_setDebugStream(request, writer); HTRequest_setAnchor(request, HTAnchor_findAddress(url)); data = g_new(struct LoadToFileData, 1); data->url = g_strdup(url); data->file = g_strdup(file); data->callback = callback; data->user_data = user_data; HTRequest_addAfter(request, after_load_to_file, NULL, data, HT_ALL, HT_FILTER_LAST, FALSE); if (HTLoad(request, NO) == NO) { fclose(fp); HTRequest_delete(request); return NULL; } return request; } struct LoadToMemData { gchar *url; HTChunk *chunk; GWWWLoadToMemFunc callback; gpointer user_data; }; static int after_load_to_mem(HTRequest *request, HTResponse */*response*/, void *param, int status) { struct LoadToMemData *data = (struct LoadToMemData *)param; printf ("after_load_to_mem\n"); /* Ignore these after events. We will get another call to the * after filter when the data actually loads. */ switch (status) { case HT_NO_ACCESS: case HT_REAUTH: case HT_PERM_REDIRECT: case HT_FOUND: case HT_SEE_OTHER: case HT_TEMP_REDIRECT: return HT_OK; default: break; } if (data->callback) (* data->callback)(data->url, HTChunk_data(data->chunk), HTChunk_size(data->chunk), status, data->user_data); g_free(data->url); HTChunk_delete(data->chunk); g_free(data); /* schedule for the request to be deleted */ g_idle_add((GSourceFunc)delete_request, request); return HT_OK; } GWWWRequest * glibwww_load_to_mem(const gchar *url, GWWWLoadToMemFunc callback, gpointer user_data) { HTRequest *request; HTStream *writer; HTChunk *chunk = NULL; struct LoadToMemData *data; g_return_val_if_fail(url != NULL, NULL); request = HTRequest_new(); writer = HTStreamToChunk(request, &chunk, 0); HTRequest_setOutputFormat(request, WWW_SOURCE); HTRequest_setOutputStream(request, writer); HTRequest_setDebugStream(request, writer); HTRequest_setAnchor(request, HTAnchor_findAddress(url)); data = g_new(struct LoadToMemData, 1); data->url = g_strdup(url); data->chunk = chunk; data->callback = callback; data->user_data = user_data; HTRequest_addAfter(request, after_load_to_mem, NULL, data, HT_ALL, HT_FILTER_LAST, FALSE); if (HTLoad(request, NO) == NO) { HTChunk_delete(chunk); HTRequest_delete(request); return NULL; } return request; } gboolean glibwww_abort_request(GWWWRequest *request) { g_return_val_if_fail(request != NULL, FALSE); return HTRequest_kill(request) == YES; } void glibwww_request_progress(GWWWRequest *request, glong *nread, glong *total) { glong tot = HTAnchor_length(HTRequest_anchor(request)); glong nr = -1; if (tot > 0) nr = HTRequest_bodyRead(request); else nr = HTRequest_bytesRead(request); if (nread) *nread = nr; if (total) *total = tot; }