Я реализовал прочитанную половину 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 для чтения а также пишу?
Я не знаю достаточно об API libcurl, но я ожидаю, что он извлекает данные, пока все данные не будут исчерпаны. Поскольку в IOStreams есть push-интерфейс, который не будет легко объединяться с pull-интерфейсом, кажется, что вам лучше всего реализовать поток, который буферизует весь вывод до его завершения, и в этот момент есть libcurl pull для легкодоступного буфера. Вы бы наверное sync()
ничего не делать и вместо этого предоставить пользовательскую функцию, скажем, send()
в вашем потоке, который является триггером для передачи управления libcurl, пока он не завершит свою работу.
Альтернативный подход состоит в том, чтобы использовать поток для загрузки libcurl и другой поток для записи в поток и передачи битов, которые записываются в libcurl при извлечении данных.
Других решений пока нет …