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