1 /* $Id: glibwww-trans.cc,v 1.1.1.1 2003/07/04 22:30:08 atterer Exp $ -*- C++ -*-
2 
3   This code was taken from glibwww2
4   <http://cvs.gnome.org/lxr/source/glibwww2/>, main author: James
5   Henstdridge <james@daa.com.au>, distributable under GPL, v2 or
6   later.
7 
8 */
9 
10 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
11 extern "C" {
12 #include <WWWCore.h>
13 #include <WWWStream.h>
14 #include <WWWTrans.h>
15 }
16 
17 #undef PACKAGE
18 #undef VERSION
19 #undef _
20 
21 #include <config.h>
22 #include <glibwww.hh>
23 #include <stdio.h>
24 
25 static gboolean
delete_request(HTRequest *)26 delete_request(HTRequest */*request*/)
27 {
28         printf ("delete_request\n");
29 
30         /*HTRequest_delete(request);*/
31         return FALSE;
32 }
33 
34 struct LoadToFileData {
35         gchar *url;
36         gchar *file;
37         GWWWLoadToFileFunc callback;
38         gpointer user_data;
39 };
40 
41 static int
after_load_to_file(HTRequest * request,HTResponse *,void * param,int status)42 after_load_to_file(HTRequest *request, HTResponse */*response*/,
43                    void *param, int status)
44 {
45         struct LoadToFileData *data = (struct LoadToFileData *)param;
46 
47         printf ("after_load_to_file\n");
48 
49         /* Ignore these after events.  We will get another call to the
50          * after filter when the data actually loads. */
51         switch (status) {
52         case HT_NO_ACCESS:
53         case HT_REAUTH:
54         case HT_PERM_REDIRECT:
55         case HT_FOUND:
56         case HT_SEE_OTHER:
57         case HT_TEMP_REDIRECT:
58                 return HT_OK;
59         default:
60                 break;
61         }
62 
63         if (data) {
64                 if (data->callback)
65                         (* data->callback)(data->url, data->file, status,
66                                            data->user_data);
67                 g_free(data->url);
68                 g_free(data->file);
69                 g_free(data);
70         }
71 
72         /* schedule for the request to be deleted */
73         g_idle_add((GSourceFunc)delete_request, request);
74 
75         return HT_OK;
76 }
77 
78 GWWWRequest *
glibwww_load_to_file(const gchar * url,const gchar * file,GWWWLoadToFileFunc callback,gpointer user_data)79 glibwww_load_to_file(const gchar *url, const gchar *file,
80                      GWWWLoadToFileFunc callback, gpointer user_data)
81 {
82         FILE *fp;
83         HTRequest *request;
84         HTStream *writer;
85         struct LoadToFileData *data;
86 
87         g_return_val_if_fail(url != NULL, NULL);
88         g_return_val_if_fail(file != NULL, NULL);
89 
90         if ((fp = fopen(file, "wb")) == NULL)
91                 return NULL;
92 
93         request = HTRequest_new();
94         writer = HTFWriter_new(request, fp, NO);
95         HTRequest_setOutputFormat(request, WWW_SOURCE);
96         HTRequest_setOutputStream(request, writer);
97         HTRequest_setDebugStream(request, writer);
98         HTRequest_setAnchor(request, HTAnchor_findAddress(url));
99 
100         data = g_new(struct LoadToFileData, 1);
101         data->url = g_strdup(url);
102         data->file = g_strdup(file);
103         data->callback = callback;
104         data->user_data = user_data;
105         HTRequest_addAfter(request, after_load_to_file, NULL, data,
106                            HT_ALL, HT_FILTER_LAST, FALSE);
107 
108         if (HTLoad(request, NO) == NO) {
109                 fclose(fp);
110                 HTRequest_delete(request);
111                 return NULL;
112         }
113         return request;
114 }
115 
116 struct LoadToMemData {
117         gchar *url;
118         HTChunk *chunk;
119         GWWWLoadToMemFunc callback;
120         gpointer user_data;
121 };
122 
123 static int
after_load_to_mem(HTRequest * request,HTResponse *,void * param,int status)124 after_load_to_mem(HTRequest *request, HTResponse */*response*/,
125                   void *param, int status)
126 {
127         struct LoadToMemData *data = (struct LoadToMemData *)param;
128 
129         printf ("after_load_to_mem\n");
130 
131         /* Ignore these after events.  We will get another call to the
132          * after filter when the data actually loads. */
133         switch (status) {
134         case HT_NO_ACCESS:
135         case HT_REAUTH:
136         case HT_PERM_REDIRECT:
137         case HT_FOUND:
138         case HT_SEE_OTHER:
139         case HT_TEMP_REDIRECT:
140                 return HT_OK;
141         default:
142                 break;
143         }
144 
145         if (data->callback)
146                 (* data->callback)(data->url, HTChunk_data(data->chunk),
147                                    HTChunk_size(data->chunk), status, data->user_data);
148         g_free(data->url);
149         HTChunk_delete(data->chunk);
150         g_free(data);
151 
152         /* schedule for the request to be deleted */
153         g_idle_add((GSourceFunc)delete_request, request);
154 
155         return HT_OK;
156 }
157 
158 GWWWRequest *
glibwww_load_to_mem(const gchar * url,GWWWLoadToMemFunc callback,gpointer user_data)159 glibwww_load_to_mem(const gchar *url, GWWWLoadToMemFunc callback,
160                     gpointer user_data)
161 {
162         HTRequest *request;
163         HTStream *writer;
164         HTChunk *chunk = NULL;
165         struct LoadToMemData *data;
166 
167         g_return_val_if_fail(url != NULL, NULL);
168 
169         request = HTRequest_new();
170         writer = HTStreamToChunk(request, &chunk, 0);
171         HTRequest_setOutputFormat(request, WWW_SOURCE);
172         HTRequest_setOutputStream(request, writer);
173         HTRequest_setDebugStream(request, writer);
174         HTRequest_setAnchor(request, HTAnchor_findAddress(url));
175 
176         data = g_new(struct LoadToMemData, 1);
177         data->url = g_strdup(url);
178         data->chunk = chunk;
179         data->callback = callback;
180         data->user_data = user_data;
181         HTRequest_addAfter(request, after_load_to_mem, NULL, data,
182                            HT_ALL, HT_FILTER_LAST, FALSE);
183 
184         if (HTLoad(request, NO) == NO) {
185                 HTChunk_delete(chunk);
186                 HTRequest_delete(request);
187                 return NULL;
188         }
189         return request;
190 }
191 
192 gboolean
glibwww_abort_request(GWWWRequest * request)193 glibwww_abort_request(GWWWRequest *request)
194 {
195         g_return_val_if_fail(request != NULL, FALSE);
196 
197         return HTRequest_kill(request) == YES;
198 }
199 
200 void
glibwww_request_progress(GWWWRequest * request,glong * nread,glong * total)201 glibwww_request_progress(GWWWRequest *request, glong *nread, glong *total)
202 {
203         glong tot = HTAnchor_length(HTRequest_anchor(request));
204         glong nr = -1;
205 
206         if (tot > 0)
207                 nr = HTRequest_bodyRead(request);
208         else
209                 nr = HTRequest_bytesRead(request);
210 
211         if (nread)
212                 *nread = nr;
213         if (total)
214                 *total = tot;
215 }
216