Gleichmal vorweg: Die Klasse ist unvollständig, teilweise vielleicht auch buggy, erst frisch fertig geworden und äußerst häßlich ohne großartige Strukturierung oder Kommentare in eine Datei gehakt.
Dennoch möchte ich sie mit euch teilen.
Beschreibung: Ich muss für ein Projekt Dateien via Http (später vielleicht auch noch FTP, weswegen es vielleicht noch eine Abstrakte Downloaderklasse geben wird) laden. Dazu benutze ich CURL, dessen typisches C-Interface halt nicht wirklich gut in die C++ Welt passt. Aus diesem Grund ist ne kleine HttpDownload-Klasse erstanden, welche die C-Callbacks in Einklang mit der C++ Welt bringt. Sowohl Userdaten, als auch Callbacks hab ich versucht, typsicher zu machen.
Hier jedenfalls mal die (unvollständige!) Klasse:
[Only registered and activated users can see links. Click Here To Register...]
Verwendung:
Die Klasse benötigt als template-Parameter die Typen für die Userdaten von write-callback und progress-callback (beide standardmäßig void).
Die Signatur für die Callbacks seht ihr im angeführten Beispiel. Der erste Parameter vom Typ bool& besimmt, ob die Callbacks für dieses Event weiter abgearbeitet werden sollen (standardmäßig true). Aus dem write-callback einfach ein false zurückgeben um den Download zu beenden (ist noch als quick&dirty-Lösung implementiert).
Wie gesagt, wirds noch ne viele, viele Änderungen geben - ggf steig ich auch komplett auf boost::signal um.
Vielleicht kann ja doch jemand was damit anfangen,
Gruß
Dennoch möchte ich sie mit euch teilen.
Beschreibung: Ich muss für ein Projekt Dateien via Http (später vielleicht auch noch FTP, weswegen es vielleicht noch eine Abstrakte Downloaderklasse geben wird) laden. Dazu benutze ich CURL, dessen typisches C-Interface halt nicht wirklich gut in die C++ Welt passt. Aus diesem Grund ist ne kleine HttpDownload-Klasse erstanden, welche die C-Callbacks in Einklang mit der C++ Welt bringt. Sowohl Userdaten, als auch Callbacks hab ich versucht, typsicher zu machen.
Hier jedenfalls mal die (unvollständige!) Klasse:
[Only registered and activated users can see links. Click Here To Register...]
Verwendung:
Die Klasse benötigt als template-Parameter die Typen für die Userdaten von write-callback und progress-callback (beide standardmäßig void).
Die Signatur für die Callbacks seht ihr im angeführten Beispiel. Der erste Parameter vom Typ bool& besimmt, ob die Callbacks für dieses Event weiter abgearbeitet werden sollen (standardmäßig true). Aus dem write-callback einfach ein false zurückgeben um den Download zu beenden (ist noch als quick&dirty-Lösung implementiert).
Code:
#include <iostream>
#include "HttpDownloader.h"
int main()
{
int totalSize = 0;
int counter = 0;
HttpDownloader<int, void> dl("http://www.elitepvpers.com/forum/images/bullet/misc/logostrip_l.gif", &counter);
auto f = [&totalSize](bool&, size_t size, char*, int* user) {
totalSize += size;
++(*user);
return true;
};
auto pf = [](bool&, double now, double total, void*) {
std::cout << "received " << now << " of " << total << " bytes\n";
};
dl.add_data_callback(f);
dl.add_progress_callback(pf);
dl.start();
std::cout << "received " << totalSize << " bytes\n";
std::cout << "data callback called " << counter << " times\n";
}
Vielleicht kann ja doch jemand was damit anfangen,
Gruß