Саммерфилд Марк
Шрифт:
Класс имеет открытую функцию getFile, которая считывает файл по указанному адресу URL. Класс QUrl имеет высокоуровневый интерфейс для извлечения различных частей URL, таких как имя файла, путь, протокол и порт.
Класс FtpGet имеет закрытый слот ftpDone(bool), который вызывается после окончания операции пересылки файла, и сигнал done, который генерируется при завершении скачивания файла. Этот класс имеет также две закрытые переменные. Переменная ftp имеет тип QFtp и инкапсулирует соединение с сервером FTP; переменная file используется для записи скачанного из сети файла на диск.
В конструкторе мы подсоединяем сигнал QFtp::done(bool) к нашему закрытому слоту ftpDone(bool). QFtp генерирует сигнал done(bool) после завершения обработки всех запросов. Параметр типа bool показывает, возникла ошибка или нет.
Функция getFile начинается с проверки переданного ей URL. Если возникла проблема, функция выводит в поток cerr сообщение об ошибке и возвращает false, указывая на неудачное скачивание файла.
Мы не обязываем пользователя указывать имя локального файла и пытаемся сами создать осмысленное имя на основе URL, а при неудаче используем имя ftpget.out. Если не удается открыть файл, мы печатаем сообщение об ошибке и возвращаем false.
Затем мы выполняем последовательность из четырех команд FTP, используя наш объект QFtp. Вызов url.port(21) возвращает номер порта, указанный в URL, или порт 21, если URL не содержит порта. Поскольку функции login не передаются ни имя пользователи, ни пароль, делается попытка анонимного входа в систему. Второй аргумент функции get задает выходное устройство ввода—вывода.
Команды FTP ставятся в очередь и обрабатываются в цикле обработки событий Qt. Завершение всех команд регистрируется сигналом done(bool) объекта QFtp, который мы подсоединили к слоту ftpDone(bool) в конструкторе.
После выполнения всех команд FTP мы закрываем файл и генерируем сигнал done. Может показаться странным, что мы закрываем файл именно здесь, а не после вызова ftp.close в конце функции getFile, но следует помнить, что команды FTP выполняются асинхронно и их выполнение вполне может быть еще не закончено после возврата управления функцией getFile. Только после генерации объектом QFtp сигнала done мы можем быть уверены, что скачивание файла завершено и теперь можно спокойно закрывать файл.