~ubuntu-branches/ubuntu/trusty/moon/trusty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 * downloader.h: Downloader class.
 *
 * Contact:
 *   Moonlight List (moonligt-list@lists.ximian.com)
 *
 * Copyright 2008 Novell, Inc. (http://www.novell.com)
 *
 * See the LICENSE file included with the distribution for details.
 * 
 */

#ifndef __DOWNLOADER_H__
#define __DOWNLOADER_H__

#include <glib.h>

G_BEGIN_DECLS

#include <stdint.h>
#include <cairo.h>

#include "dependencyobject.h"
#include "internal-downloader.h"
#include "http-streaming.h"

class FileDownloader;
class Downloader;

typedef void     (*downloader_write_func) (void *buf, gint32 offset, gint32 n, gpointer cb_data);
typedef void     (*downloader_notify_size_func) (gint64 size, gpointer cb_data);

typedef gpointer (*downloader_create_state_func) (Downloader *dl);
typedef void     (*downloader_destroy_state_func) (gpointer state);
typedef void     (*downloader_open_func) (const char *verb, const char *uri, bool streaming, gpointer state);
typedef void     (*downloader_send_func) (gpointer state);
typedef void     (*downloader_abort_func) (gpointer state);
typedef void     (*downloader_header_func) (gpointer state, const char *header, const char *value);
typedef void     (*downloader_body_func) (gpointer state, void *body, guint32 length);
typedef gpointer (*downloader_create_webrequest_func) (const char *method, const char *uri, gpointer context);

enum DownloaderAccessPolicy {
	DownloaderPolicy,
	MediaPolicy,
	XamlPolicy,
	StreamingPolicy,
	NoPolicy
};

/* @Namespace=None */
/* @ManagedDependencyProperties=None */
class Downloader : public DependencyObject {
	static downloader_create_state_func create_state;
	static downloader_destroy_state_func destroy_state;
	static downloader_open_func open_func;
	static downloader_send_func send_func;
	static downloader_abort_func abort_func;
	static downloader_header_func header_func;
	static downloader_body_func body_func;
	static downloader_create_webrequest_func request_func;

	// Set by the consumer
	downloader_notify_size_func notify_size;
	downloader_write_func write;
	gpointer consumer_closure;
	
	// Set by the supplier.
	gpointer downloader_state;
	
	gpointer context;
	HttpStreamingFeatures streaming_features;
	
	gint64 file_size;
	gint64 total;
	
	char *filename;
	char *buffer;
	
	char *failed_msg;
	bool send_queued;
	bool started;
	bool aborted;
	bool completed;
	InternalDownloader *internal_dl;

	DownloaderAccessPolicy access_policy;

 protected:
	virtual ~Downloader ();
	
	void SetStatusText (const char *text);
	void SetStatus (int status);
	
 public:
	// Properties
	/* @PropertyType=double,DefaultValue=0.0 */
	static DependencyProperty *DownloadProgressProperty;
	/* @PropertyType=string */
	static DependencyProperty *ResponseTextProperty;
	/* @PropertyType=gint32,DefaultValue=0 */
	static DependencyProperty *StatusProperty;
	/* @PropertyType=string,DefaultValue=\"\" */
	static DependencyProperty *StatusTextProperty;
	/* @PropertyType=string */
	static DependencyProperty *UriProperty;
	
	// Events you can AddHandler to
	const static int CompletedEvent;
	const static int DownloadProgressChangedEvent;
	const static int DownloadFailedEvent;
	
	/* @GenerateCBinding */
	Downloader ();
	
	virtual Type::Kind GetObjectType () { return Type::DOWNLOADER; };	
	
	void Abort ();
	char *GetResponseText (const char *Partname, guint64 *size);
	void Open (const char *verb, const char *uri, DownloaderAccessPolicy policy);
	void SendInternal ();
	void Send ();
	void SendNow ();
	
	// the following is stuff not exposed by C#/js, but is useful
	// when writing unmanaged code for downloader implementations
	// or data sinks.
	
	void InternalAbort ();
	void InternalWrite (void *buf, gint32 offset, gint32 n);
	void InternalOpen (const char *verb, const char *uri, bool streaming);
	void InternalSetHeader (const char *header, const char *value);
	void InternalSetBody (void *body, guint32 length);

	void Write (void *buf, gint32 offset, gint32 n);
	void NotifyFinished (const char *final_uri);
	void NotifyFailed (const char *msg);
	void NotifySize (gint64 size);
	char *GetDownloadedFilename (const char *partname);
	void SetFilename (const char *fname);
	
	InternalDownloader *GetInternalDownloader () { return internal_dl; }
	
	// This is called by the consumer of the downloaded data (the
	// Image class for instance)
	void SetWriteFunc (downloader_write_func write,
			   downloader_notify_size_func notify_size,
			   gpointer closure);
	
	// This is called by the supplier of the downloaded data (the
	// managed framework, the browser plugin, the demo test)
	static void SetFunctions (downloader_create_state_func create_state,
				  downloader_destroy_state_func destroy_state,
				  downloader_open_func open,
				  downloader_send_func send,
				  downloader_abort_func abort,
				  downloader_header_func header,
				  downloader_body_func body,
			          downloader_create_webrequest_func request,
				  bool only_if_not_set);
		
	bool Started ();
	bool Completed ();
	bool IsAborted () { return aborted; }
	
	void     SetContext (gpointer context) { this->context = context;}
	gpointer GetContext () { return context; }
	gpointer GetDownloaderState () { return downloader_state; }
	void     SetHttpStreamingFeatures (HttpStreamingFeatures features) { streaming_features = features; }
	HttpStreamingFeatures GetHttpStreamingFeatures () { return streaming_features; }
	downloader_create_webrequest_func GetRequestFunc () {return request_func; }

	//
	// Property Accessors
	//
	void SetDownloadProgress (double progress);
	double GetDownloadProgress ();
	
	const char *GetStatusText ();
	int GetStatus ();
	
	void SetUri (const char *uri);
	const char *GetUri ();

	// FIXME: This is exposed for text right now and should be cleaned up.
	FileDownloader *getFileDownloader () { return (FileDownloader *) internal_dl; }
};

class DownloaderResponse;
class DownloaderRequest;

typedef uint32_t (* DownloaderResponseStartedHandler) (DownloaderResponse *response, gpointer context);
typedef uint32_t (* DownloaderResponseDataAvailableHandler) (DownloaderResponse *response, gpointer context, char *buffer, uint32_t length);
typedef uint32_t (* DownloaderResponseFinishedHandler) (DownloaderResponse *response, gpointer context, bool success, gpointer data, const char *uri);
typedef void (*DownloaderResponseHeaderVisitorCallback) (const char *header, const char *value);

class DownloaderResponse {
 protected:
	DownloaderResponseStartedHandler started;
	DownloaderResponseDataAvailableHandler available;
	DownloaderResponseFinishedHandler finished;
	gpointer context;
	DownloaderRequest *request;
	bool aborted;

 public:
	DownloaderResponse ();
	DownloaderResponse (DownloaderResponseStartedHandler started, DownloaderResponseDataAvailableHandler available, DownloaderResponseFinishedHandler finished, gpointer context);
	virtual ~DownloaderResponse ();

	virtual void Abort () = 0;
	virtual const bool IsAborted () { return this->aborted; }
	virtual void SetHeaderVisitor (DownloaderResponseHeaderVisitorCallback visitor) = 0;
	DownloaderRequest *GetDownloaderRequest () { return request; }
	void SetDownloaderRequest (DownloaderRequest *value) { request = value; }
};

class DownloaderRequest {
 protected:
 	DownloaderResponse *response;
	char *uri;
	char *method;

	bool aborted;

 public:
	DownloaderRequest (const char *method, const char *uri);
	virtual ~DownloaderRequest ();

	virtual void Abort () = 0;
	virtual bool GetResponse (DownloaderResponseStartedHandler started, DownloaderResponseDataAvailableHandler available, DownloaderResponseFinishedHandler finished, gpointer context) = 0;
	virtual const bool IsAborted () { return this->aborted; }
	virtual void SetHttpHeader (const char *name, const char *value) = 0;
	virtual void SetBody (void *body, int size) = 0;
	DownloaderResponse *GetDownloaderResponse () { return response; }
	void SetDownloaderResponse (DownloaderResponse *value) { response = value; }
};

double downloader_get_download_progress (Downloader *dl);

const char *downloader_get_status_text (Downloader *dl);
int downloader_get_status (Downloader *dl);

void downloader_set_uri (Downloader *dl, const char *uri);
const char *downloader_get_uri (Downloader *dl);

Surface *downloader_get_surface    (Downloader *dl);


void  downloader_abort	       (Downloader *dl);
char *downloader_get_downloaded_file (Downloader *dl);
char *downloader_get_response_text   (Downloader *dl, const char *PartName, guint64 *size);
char *downloader_get_response_file   (Downloader *dl, const char *PartName);
//void  downloader_open		(Downloader *dl, const char *verb, const char *uri);
void  downloader_send		(Downloader *dl);

//
// Used to push data to the consumer
//
void downloader_write		(Downloader *dl, void *buf, gint32 offset, gint32 n);
void downloader_completed       (Downloader *dl, const char *filename);

void downloader_notify_size     (Downloader *dl, gint64 size);
void downloader_notify_finished (Downloader *dl, const char *filename);
void downloader_notify_error    (Downloader *dl, const char *msg);


void downloader_set_functions (downloader_create_state_func create_state,
			       downloader_destroy_state_func destroy_state,
			       downloader_open_func open,
			       downloader_send_func send,
			       downloader_abort_func abort,
			       downloader_header_func header,
			       downloader_body_func body,
			       downloader_create_webrequest_func request);

void downloader_init (void);

void *downloader_create_webrequest (Downloader *dl, const char *method, const char *uri);

void downloader_request_abort (DownloaderRequest *dr);
bool downloader_request_get_response (DownloaderRequest *dr, DownloaderResponseStartedHandler started, DownloaderResponseDataAvailableHandler available, DownloaderResponseFinishedHandler finished, gpointer context);
bool downloader_request_is_aborted (DownloaderRequest *dr);
void downloader_request_set_http_header (DownloaderRequest *dr, const char *name, const char *value);
void downloader_request_set_body (DownloaderRequest *dr, void *body, int size);

void downloader_response_set_header_visitor (DownloaderResponse *dr, DownloaderResponseHeaderVisitorCallback visitor);

G_END_DECLS

#endif