Обернуть libcurl std :: streambuf для загрузки?

Я реализовал прочитанную половину std::streambuf API (т.е. underflow() а также xsgetn()) вокруг libcurl так что обычный istream может иметь такой streambuf подключите к нему и получите содержимое с HTTP или FTP серверов. Работает отлично.

Теперь я хотел бы реализовать половину API записи (т.е. overflow() а также xsputn()) для загрузки файлов на FTP-сервер, чтобы сделать что-то вроде:

ostream os( my_curl_streambuf );
curl_easy_setopt( my_curl_handle, CURLOPT_UPLOAD, 1L );
os << is->rdbuf(); // copy entire contents of istream "is" to ostream "os"

Проблема в том, что libcurl использует API «pull» через функцию обратного вызова чтения, установленную через CURLOPT_READFUNCTION в то время как последняя строка кода выше — это «толчок».

Можно ли заставить это работать? То есть, обернуть libcurl с streambuf API для чтения а также пишу?

1

Решение

Я не знаю достаточно об API libcurl, но я ожидаю, что он извлекает данные, пока все данные не будут исчерпаны. Поскольку в IOStreams есть push-интерфейс, который не будет легко объединяться с pull-интерфейсом, кажется, что вам лучше всего реализовать поток, который буферизует весь вывод до его завершения, и в этот момент есть libcurl pull для легкодоступного буфера. Вы бы наверное sync() ничего не делать и вместо этого предоставить пользовательскую функцию, скажем, send() в вашем потоке, который является триггером для передачи управления libcurl, пока он не завершит свою работу.

Альтернативный подход состоит в том, чтобы использовать поток для загрузки libcurl и другой поток для записи в поток и передачи битов, которые записываются в libcurl при извлечении данных.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]