15abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang/* 25abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * Copyright 2015 The Android Open Source Project 35abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * 45abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 55abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * you may not use this file except in compliance with the License. 65abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * You may obtain a copy of the License at 75abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * 85abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * http://www.apache.org/licenses/LICENSE-2.0 95abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * 105abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * Unless required by applicable law or agreed to in writing, software 115abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 125abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * See the License for the specific language governing permissions and 145abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang * limitations under the License. 155abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang */ 165abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 175abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang#ifndef HTTP_DOWNLOADER_H_ 185abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 195abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang#define HTTP_DOWNLOADER_H_ 205abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 215abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang#include <media/stagefright/foundation/ADebug.h> 225abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang#include <utils/KeyedVector.h> 235abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang#include <utils/Mutex.h> 245abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang#include <utils/RefBase.h> 255abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 265abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangnamespace android { 275abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 285abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct ABuffer; 295abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangclass DataSource; 305abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct HTTPBase; 315abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct IMediaHTTPService; 325abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct M3UParser; 335abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 345abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct HTTPDownloader : public RefBase { 355abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang HTTPDownloader( 365abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang const sp<IMediaHTTPService> &httpService, 375abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang const KeyedVector<String8, String8> &headers); 385abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 395abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void reconnect(); 405abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void disconnect(); 415abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang bool isDisconnecting(); 425abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // If given a non-zero block_size (default 0), it is used to cap the number of 435abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // bytes read in from the DataSource. If given a non-NULL buffer, new content 445abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // is read into the end. 455abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // 465abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // The DataSource we read from is responsible for signaling error or EOF to help us 475abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // break out of the read loop. The DataSource can be returned to the caller, so 485abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // that the caller can reuse it for subsequent fetches (within the initially 495abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // requested range). 505abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // 515abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // For reused HTTP sources, the caller must download a file sequentially without 525abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // any overlaps or gaps to prevent reconnection. 535abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang ssize_t fetchBlock( 545abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang const char *url, 555abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<ABuffer> *out, 565abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang int64_t range_offset, /* open file at range_offset */ 575abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang int64_t range_length, /* open file for range_length (-1: entire file) */ 585abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang uint32_t block_size, /* download block size (0: entire range) */ 595abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang String8 *actualUrl, /* returns actual URL */ 605abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang bool reconnect /* force connect http */ 615abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang ); 625abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 635abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // simplified version to fetch a single file 645abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang ssize_t fetchFile( 655abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang const char *url, 665abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<ABuffer> *out, 675abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang String8 *actualUrl = NULL); 685abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 695abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang // fetch a playlist file 705abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<M3UParser> fetchPlaylist( 715abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang const char *url, uint8_t *curPlaylistHash, bool *unchanged); 725abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 735abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangprivate: 745abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<HTTPBase> mHTTPDataSource; 755abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<DataSource> mDataSource; 765abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang KeyedVector<String8, String8> mExtraHeaders; 775abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 785abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang Mutex mLock; 795abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang bool mDisconnecting; 805abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 815abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang DISALLOW_EVIL_CONSTRUCTORS(HTTPDownloader); 825abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang}; 835abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 845abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang} // namespace android 855abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 865abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang#endif // HTTP_DOWNLOADER_H_ 87