/*****************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * $Id: curlgtk.c,v 1.4 2004/02/09 07:12:33 bagder Exp $
 */
/* Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft */
/* an attempt to use the curl library in concert with a gtk-threaded application */

#include <stdio.h>
#include <gtk/gtk.h>

#include <curl/curl.h>
#include <curl/types.h> /* new for v7 */
#include <curl/easy.h> /* new for v7 */

GtkWidget *Bar;

size_t my_write_func( void *ptr, size_t size, size_t nmemb, FILE *stream ) {
	return fwrite( ptr, size, nmemb, stream );
}

size_t my_read_func( void *ptr, size_t size, size_t nmemb, FILE *stream ) {
	return fread( ptr, size, nmemb, stream );
}

int my_progress_func( GtkWidget *Bar,
					  double t, /* dltotal */
					  double d, /* dlnow */
					  double ultotal,
					  double ulnow ) {
/*  printf("%d / %d (%g %%)\n", d, t, d*100.0/t);*/
	gdk_threads_enter();
	gtk_progress_set_value( GTK_PROGRESS( Bar ), d * 100.0 / t );
	gdk_threads_leave();
	return 0;
}

void *curl_thread( void *ptr ) {
	CURL *curl;
	CURLcode res;
	FILE *outfile;
	gchar *url = ptr;

	curl = curl_easy_init();
	if ( curl ) {
		outfile = fopen( "test.curl", "w" );

		curl_easy_setopt( curl, CURLOPT_URL, url );
		curl_easy_setopt( curl, CURLOPT_WRITEDATA, outfile );
		curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, my_write_func );
		curl_easy_setopt( curl, CURLOPT_READFUNCTION, my_read_func );
		curl_easy_setopt( curl, CURLOPT_NOPROGRESS, FALSE );
		curl_easy_setopt( curl, CURLOPT_PROGRESSFUNCTION, my_progress_func );
		curl_easy_setopt( curl, CURLOPT_PROGRESSDATA, Bar );

		res = curl_easy_perform( curl );

		fclose( outfile );
		/* always cleanup */
		curl_easy_cleanup( curl );
	}

	return NULL;
}

int main( int argc, char **argv ) {
	GtkWidget *Window, *Frame, *Frame2;
	GtkAdjustment *adj;

	/* Init thread */
	g_thread_init( NULL );

	gtk_init( &argc, &argv );
	Window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
	Frame = gtk_frame_new( NULL );
	gtk_frame_set_shadow_type( GTK_FRAME( Frame ), GTK_SHADOW_OUT );
	gtk_container_add( GTK_CONTAINER( Window ), Frame );
	Frame2 = gtk_frame_new( NULL );
	gtk_frame_set_shadow_type( GTK_FRAME( Frame2 ), GTK_SHADOW_IN );
	gtk_container_add( GTK_CONTAINER( Frame ), Frame2 );
	gtk_container_set_border_width( GTK_CONTAINER( Frame2 ), 5 );
	adj = (GtkAdjustment*)gtk_adjustment_new( 0, 0, 100, 0, 0, 0 );
	Bar = gtk_progress_bar_new_with_adjustment( adj );
	gtk_container_add( GTK_CONTAINER( Frame2 ), Bar );
	gtk_widget_show_all( Window );

	if ( !g_thread_create( &curl_thread, argv[1], FALSE, NULL ) != 0 ) {
		g_warning( "can't create the thread" );
	}


	gdk_threads_enter();
	gtk_main();
	gdk_threads_leave();
	return 0;
}

