Вопрос про curl_multi и контейнеры
От: DrunkPilot  
Дата: 16.08.14 19:21
Оценка:
Третий день не могу сообразить как правильно сохранить результат curl_multi в контейнер . То есть из callback'a типа

size_t write_callback (void * buff , size_t size, size_t num, void * outstream);


записать в map<std::string url,std::string html> .
Нужно как-то связать данные с url источника . В параметрах callback'a самому можно задавать только outstream через CURLOPT_WRITEDATA.
На сайте курла все multi-примеры пишут данные в фаил . Либо вообще не пишут , а только проверяют на success .
В общем подкиньте пример что-ли .
Re: Вопрос про curl_multi и контейнеры
От: BNN Украина  
Дата: 05.09.14 05:37
Оценка:
Здравствуйте, DrunkPilot, Вы писали:

DP>Третий день не могу сообразить как правильно сохранить результат curl_multi в контейнер . То есть из callback'a типа

...
DP>записать в map<std::string url,std::string html> .
DP>Нужно как-то связать данные с url источника . В параметрах callback'a самому можно задавать только outstream через CURLOPT_WRITEDATA.
DP>На сайте курла все multi-примеры пишут данные в фаил . Либо вообще не пишут , а только проверяют на success .
DP>В общем подкиньте пример что-ли .

Вместо файла можно писать в std::stringstream, а результат потом скопировать в строку:

....

std::stringstream sstr;
write_callback (buff , size, num, &sstr);

std::string str = sstr.str();

....
Re[2]: Вопрос про curl_multi и контейнеры
От: Кодт Россия  
Дата: 05.09.14 09:39
Оценка:
Здравствуйте, BNN, Вы писали:

BNN>Вместо файла можно писать в std::stringstream, а результат потом скопировать в строку:


BNN>std::stringstream sstr;
BNN>write_callback (buff , size, num, &sstr);

Что, вот так, по-простому, привести stringstream к void* ? Фигассе типизация.
(Я в либкурл не играл, просто мимо шёл и удивился).
А что не взять какой-нибудь биндинг к С++
Перекуём баги на фичи!
Re[3]: Вопрос про curl_multi и контейнеры
От: watchmaker  
Дата: 05.09.14 12:41
Оценка:
Здравствуйте, Кодт, Вы писали:

BNN>>std::stringstream sstr;
BNN>>write_callback (buff , size, num, &sstr);

К>Что, вот так, по-простому, привести stringstream к void* ?
Не stringstream к void*, а указатель к void*.

К>Фигассе типизация. (Я в либкурл не играл, просто мимо шёл и удивился).

Ну, так вообще-то не только в curl сделано, а практически везде. Указатель на пользовательский контекст (который почему-то автор темы обозвал невразумительным именем outstream) передаётся в callback дополнительным параметром. Какому же ещё ему быть типу, если не void*? Ведь только пользовательский код знает как его интерпретировать, а самой библиотеке этот указатель вообще не нужен — она о нём и его типе ничего не знает и никак не использует, а лишь возвращает обратно.
Re[4]: Вопрос про curl_multi и контейнеры
От: Кодт Россия  
Дата: 05.09.14 13:48
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Ну, так вообще-то не только в curl сделано, а практически везде. Указатель на пользовательский контекст (который почему-то автор темы обозвал невразумительным именем outstream) передаётся в callback дополнительным параметром. Какому же ещё ему быть типу, если не void*? Ведь только пользовательский код знает как его интерпретировать, а самой библиотеке этот указатель вообще не нужен — она о нём и его типе ничего не знает и никак не использует, а лишь возвращает обратно.


А, если это пользовательский колбек, тогда да. (Я думал, что это что-то штатное-родное, которое пишет в файл).
Только нужно проследить, чтобы с той стороны void* приводился обратно строго к тому же stringstream'у; либо передавать в колбек (void*)(ostream*)&sstr и восстанавливать void* до ostream*
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.