#ifndef CHROME_BROWSER_ANDROID_ANDROID_STREAM_READER_URL_REQUEST_JOB_H_
#define CHROME_BROWSER_ANDROID_ANDROID_STREAM_READER_URL_REQUEST_JOB_H_
#include "base/android/scoped_java_ref.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/non_thread_safe.h"
#include "net/http/http_byte_range.h"
#include "net/url_request/url_request_job.h"
namespace net {
class URLRequest;
}
class AndroidStreamReaderURLRequestJob : public net::URLRequestJob {
public:
* We use a delegate so that we can share code for this job in slightly
* different contexts.
*/
class Delegate {
public:
virtual base::android::ScopedJavaLocalRef<jobject> OpenInputStream(
JNIEnv* env,
net::URLRequest* request) = 0;
virtual bool GetMimeType(
JNIEnv* env,
net::URLRequest* request,
jobject stream,
std::string* mime_type) = 0;
virtual bool GetCharset(
JNIEnv* env,
net::URLRequest* request,
jobject stream,
std::string* charset) = 0;
virtual ~Delegate() {}
};
explicit AndroidStreamReaderURLRequestJob(
net::URLRequest* request,
net::NetworkDelegate* network_delegate,
scoped_ptr<Delegate> delegate);
static bool InitJNIBindings(JNIEnv* env);
virtual void Start() OVERRIDE;
virtual bool ReadRawData(net::IOBuffer* buf,
int buf_size,
int* bytes_read) OVERRIDE;
virtual void SetExtraRequestHeaders(
const net::HttpRequestHeaders& headers) OVERRIDE;
virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
virtual bool GetCharset(std::string* charset) OVERRIDE;
protected:
virtual ~AndroidStreamReaderURLRequestJob();
private:
bool VerifyRequestedRange(JNIEnv* env);
bool SkipToRequestedRange(JNIEnv* env);
net::HttpByteRange byte_range_;
scoped_ptr<Delegate> delegate_;
base::android::ScopedJavaGlobalRef<jobject> stream_;
base::android::ScopedJavaGlobalRef<jbyteArray> buffer_;
DISALLOW_COPY_AND_ASSIGN(AndroidStreamReaderURLRequestJob);
};
#endif