|
Программирование >> Формирование пользовательского контейнера
у функции download О три параметра. Первый - url - указатель на строку, содержащую полный URL-адрес файла (включая его имя). Предполагается, что Л1ЛЯ файла располагается в этой строке после последнего символа (слэщ). Например, в приведенной далее строке URL-адреса имя файла - MyFile.dat: bttp: www.SoeSite.com/MyFiIe.dat Помните, что надо задавать полный URL-адрес, используя его каноническую форму, включающую http: . Второй параметр, reload, определяет, будет ли файл загружаться повторно. Если переменная reload имеет значение true, файл будет зафужаться полностью, независимо от того, есть ли он на диске (целиком или только часть). Если же значение переменной false, то загружается только остаток файла (если он есть). Таким образом, если вы хотите получить свежую копию файла, который вы уже зафузили из Интернета, передайте значение true в параметре reload. Третий параметр функции - update. Это указатель на функцию, которая будет периодически вызываться из функции download о для уведомления кода пользователя о состоянии процесса зафузки. Если значение этого параметра - null, функция update не применяется. Мы вернемся к обсуждению требований к этому параметру немного позднее. Далее объявляются следующие локальные переменные: of stream fout; выходной поток imsigned char buf[BUF SIZE]; входной буфер unsigrned long numrcved; количество считанных байтов unsigned long filelen; длина файла на диске HINTERNET hlurl, hInet; интернет-дескрипторы unsigned long contentlen; длина контента unsignied long len; длина contentlen unsigned long total =0; накапливаемый итог полученных байтов char header[80]; содержит Range header Обратите внимание на переменные hiurl и hinet. Они содержат дескрипторы для загружаемого ресурса URL и интернет-соединения соответственно. Тот или иной из этих дескрипторов используется API-функциями библиотеки WinlNet. Код функции main начинается с приведенных далее строк. Обратите внима-**Ие на то, что весь код зафузчика заключен в блок try/catch, который обрабатывает соединение и/или файловые ощибки. try { if(!ishttp{url)) throw DLExc( Must be HTTP url. ); Прежде всего, функция downloadO вызывает функцию ishttp о для того чтобы выяснить, задан ли в URL-адресе HTTP-запрос, т. е. URL-адрес начинается с комбинации символов http . Как объяснялось ранее, только HTTP-запросы обрабатываются загрузчиком файлов из Интернета. Далее полученный файл открывается и определяется егр длина. Открывает файл, заданный в url. Открытый поток будет возвращаться в fout. Если reload равна true, данные любого загружавшегося прежде файла будут удалены. Возвращается длина любого загружавшегося ранее файла (после возможного удаления данных). filelen = openfile(url, reload, fout); Как объясняется в комментариях, если на диске нет файла или надо его за-фузить заново, длина любого зафуженного ранее файла с заданным именем будет укорочена до нуля и длина файла, возвращаемая функцией openfiieo, будет равна нулю. В противном случае, если файл на диске есть, будет возвращена его длина. Помните, если зафузка была прервана, к моменту ее рестарта на диске может существовать частичный файл. После открытия файла устанавливается соединение с Интернетом с помощью приведенного далее кода: Проверяет, доступно ли интернет-соединение, if (IntemetAtteitptConnect(O) != ERROR SUCCESS) throw DLExc( Cant connect. ); Открывает интернет-соединение. hInet = IntemetOpen( downloader , INTERNET OPEN TYPE DIRECT/ NULL, NULL, 0); if(hInet == NULL) throw DLExc( Cant open connection. ); Сначала делается попытка установить соединение с Интернетом с помощью вызова API-функции intemetAttemptconnect () ИЗ библиотеки WinlNet-Функция возвращает error success, если оно возможно. Единственный аргумент функции зарезервирован и должен быть нулевым. Если в этот момент компьютер не соединен с Интернетом, вы увидите диалоговое окно (в соответствии с установками на ващем компьютере), спрашивающее о том, не хотите ли вы установить соединение. Если подключение к Интернету невозможно, функция intemetAttemptconnect о вернет ОШИбку, ВЫЗЫ вающую генерацию исключения. Предположим, что соединение доступно, тогда для открытия соединения вызывается функция mtemetopen (). Это еще одна API-функция из библиотеки WinlNet, далее приведен ее прототип. giNTERNET InternetOpen(LPCTSTR agent, DWORD access, LPCTSTR proxy, LPCTSTR proxopt, DWORD options); Параметр agent задает имя приложения, access - тип доступа. Для нашего зафузчика значение типа доступа равно internet open type direct. В этом случае параметры proxy и proxopt не используются и должны быть равны null. В параметре options устанавливаются дополнительные характеристики соединения, не требующиеся зафузчику. Функция возвращает дескриптор открытого соединения. Если соединение не может быть открыто, возвращается null. Как только соединение открывается, генерируется заголовок Range. Конструирует заголовок запрашиваемого интервала данных, sprintf(header, Range:bytes=%d- , filelen); Далее заголовок передается функции internetopenurl () из библиотеки WinlNet, которая открывает URL-адрес, заданный в параметре url. Открывает URL-адрес и запрашивает диапазон, hlurl = Internetopenurl(hInet, url, header, -1, INTERNET FLAG N0 CACHE WRITE, 0); if (hlurl == null) throw DLExc( Cant open url. ); Прототип этой функции приведен далее. HINTERNET Internetopenurl(HINTERNET hJnet, LPCTSTR url, LPCTSTR headerstr. DWORD headlen, DWORD options, LPDWORD extra); В параметре hJnet передается дескриптор интернет-соединения, полученный из функции internetopeno. В параметре url приводится указатель на *оку, содержащую URL-адрес, который надо открыть. Указатель на строку одним или несколькими дополнительными заголовками, которые нужно включить в запрос, передается в параметре headerstr. Длина его содержится в параметре headlen, который может быть равен -1, если параметр headerstr указывает на нуль-терминированную строку, как это сделано в П>узчике. Различные флаги могут быть заданы в параметре options. Далее Приведен один из них, использующийся в зафузчике: ERNET FLAG NO CACHE WRITE
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |