|  | // Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_ | 
|  | #define COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_ | 
|  |  | 
|  | #include <jni.h> | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/android/jni_android.h" | 
|  | #include "base/android/jni_array.h" | 
|  | #include "base/android/jni_string.h" | 
|  | #include "base/android/scoped_java_ref.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/time/time.h" | 
|  | #include "components/cronet/cronet_url_request.h" | 
|  | #include "url/gurl.h" | 
|  |  | 
|  | namespace net { | 
|  | enum LoadState; | 
|  | class UploadDataStream; | 
|  | }  // namespace net | 
|  |  | 
|  | namespace cronet { | 
|  |  | 
|  | class CronetURLRequestContextAdapter; | 
|  | class TestUtil; | 
|  |  | 
|  | // An adapter from Java CronetUrlRequest object to native CronetURLRequest. | 
|  | // Created and configured from a Java thread. Start, ReadData, and Destroy are | 
|  | // posted to network thread and all callbacks into the Java CronetUrlRequest are | 
|  | // done on the network thread. Java CronetUrlRequest is expected to initiate the | 
|  | // next step like FollowDeferredRedirect, ReadData or Destroy. Public methods | 
|  | // can be called on any thread. | 
|  | class CronetURLRequestAdapter : public CronetURLRequest::Callback { | 
|  | public: | 
|  | // Bypasses cache if |jdisable_cache| is true. If context is not set up to | 
|  | // use cache, |jdisable_cache| has no effect. |jdisable_connection_migration| | 
|  | // causes connection migration to be disabled for this request if true. If | 
|  | // global connection migration flag is not enabled, | 
|  | // |jdisable_connection_migration| has no effect. | 
|  | CronetURLRequestAdapter(CronetURLRequestContextAdapter* context, | 
|  | JNIEnv* env, | 
|  | jobject jurl_request, | 
|  | const GURL& url, | 
|  | net::RequestPriority priority, | 
|  | jboolean jdisable_cache, | 
|  | jboolean jdisable_connection_migration, | 
|  | jboolean jenable_metrics, | 
|  | jboolean jtraffic_stats_tag_set, | 
|  | jint jtraffic_stats_tag, | 
|  | jboolean jtraffic_stats_uid_set, | 
|  | jint jtraffic_stats_uid); | 
|  | ~CronetURLRequestAdapter() override; | 
|  |  | 
|  | // Methods called prior to Start are never called on network thread. | 
|  |  | 
|  | // Sets the request method GET, POST etc. | 
|  | jboolean SetHttpMethod(JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& jcaller, | 
|  | const base::android::JavaParamRef<jstring>& jmethod); | 
|  |  | 
|  | // Adds a header to the request before it starts. | 
|  | jboolean AddRequestHeader(JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& jcaller, | 
|  | const base::android::JavaParamRef<jstring>& jname, | 
|  | const base::android::JavaParamRef<jstring>& jvalue); | 
|  |  | 
|  | // Adds a request body to the request before it starts. | 
|  | void SetUpload(std::unique_ptr<net::UploadDataStream> upload); | 
|  |  | 
|  | // Starts the request. | 
|  | void Start(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller); | 
|  |  | 
|  | void GetStatus(JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& jcaller, | 
|  | const base::android::JavaParamRef<jobject>& jstatus_listener); | 
|  |  | 
|  | // Follows redirect. | 
|  | void FollowDeferredRedirect( | 
|  | JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& jcaller); | 
|  |  | 
|  | // Reads more data. | 
|  | jboolean ReadData(JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& jcaller, | 
|  | const base::android::JavaParamRef<jobject>& jbyte_buffer, | 
|  | jint jposition, | 
|  | jint jcapacity); | 
|  |  | 
|  | // Releases all resources for the request and deletes the object itself. | 
|  | // |jsend_on_canceled| indicates if Java onCanceled callback should be | 
|  | // issued to indicate when no more callbacks will be issued. | 
|  | void Destroy(JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& jcaller, | 
|  | jboolean jsend_on_canceled); | 
|  |  | 
|  | // CronetURLRequest::Callback implementations: | 
|  | void OnReceivedRedirect(const std::string& new_location, | 
|  | int http_status_code, | 
|  | const std::string& http_status_text, | 
|  | const net::HttpResponseHeaders* headers, | 
|  | bool was_cached, | 
|  | const std::string& negotiated_protocol, | 
|  | const std::string& proxy_server, | 
|  | int64_t received_byte_count) override; | 
|  | void OnResponseStarted(int http_status_code, | 
|  | const std::string& http_status_text, | 
|  | const net::HttpResponseHeaders* headers, | 
|  | bool was_cached, | 
|  | const std::string& negotiated_protocol, | 
|  | const std::string& proxy_server, | 
|  | int64_t received_byte_count) override; | 
|  | void OnReadCompleted(scoped_refptr<net::IOBuffer> buffer, | 
|  | int bytes_read, | 
|  | int64_t received_byte_count) override; | 
|  | void OnSucceeded(int64_t received_byte_count) override; | 
|  | void OnError(int net_error, | 
|  | int quic_error, | 
|  | const std::string& error_string, | 
|  | int64_t received_byte_count) override; | 
|  | void OnCanceled() override; | 
|  | void OnDestroyed() override; | 
|  | void OnMetricsCollected(const base::Time& request_start_time, | 
|  | const base::TimeTicks& request_start, | 
|  | const base::TimeTicks& dns_start, | 
|  | const base::TimeTicks& dns_end, | 
|  | const base::TimeTicks& connect_start, | 
|  | const base::TimeTicks& connect_end, | 
|  | const base::TimeTicks& ssl_start, | 
|  | const base::TimeTicks& ssl_end, | 
|  | const base::TimeTicks& send_start, | 
|  | const base::TimeTicks& send_end, | 
|  | const base::TimeTicks& push_start, | 
|  | const base::TimeTicks& push_end, | 
|  | const base::TimeTicks& receive_headers_end, | 
|  | const base::TimeTicks& request_end, | 
|  | bool socket_reused, | 
|  | int64_t sent_bytes_count, | 
|  | int64_t received_bytes_count) override; | 
|  |  | 
|  | void OnStatus( | 
|  | const base::android::ScopedJavaGlobalRef<jobject>& status_listener_ref, | 
|  | net::LoadState load_status); | 
|  |  | 
|  | private: | 
|  | friend class TestUtil; | 
|  |  | 
|  | // Native Cronet URL Request that owns |this|. | 
|  | CronetURLRequest* request_; | 
|  |  | 
|  | // Java object that owns this CronetURLRequestContextAdapter. | 
|  | base::android::ScopedJavaGlobalRef<jobject> owner_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(CronetURLRequestAdapter); | 
|  | }; | 
|  |  | 
|  | }  // namespace cronet | 
|  |  | 
|  | #endif  // COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_ |