| Index: components/cronet/android/cronet_url_request_context.cc
|
| diff --git a/components/cronet/android/cronet_url_request_context.cc b/components/cronet/android/cronet_url_request_context.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..df0a3eff84cd77e506bf786af1a66b8cfc45fd00
|
| --- /dev/null
|
| +++ b/components/cronet/android/cronet_url_request_context.cc
|
| @@ -0,0 +1,150 @@
|
| +// 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.
|
| +
|
| +#include "components/cronet/android/cronet_url_request_context.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/android/jni_android.h"
|
| +#include "base/android/jni_string.h"
|
| +#include "base/json/json_reader.h"
|
| +#include "base/logging.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/metrics/statistics_recorder.h"
|
| +#include "base/values.h"
|
| +#include "components/cronet/android/cronet_url_request.h"
|
| +#include "components/cronet/android/cronet_url_request_adapter.h"
|
| +#include "components/cronet/android/cronet_url_request_context_adapter.h"
|
| +#include "components/cronet/url_request_context_config.h"
|
| +#include "jni/CronetUrlRequestContext_jni.h"
|
| +
|
| +namespace {
|
| +
|
| +// Delegate of CronetURLRequestContextAdapter that delivers callbacks to the
|
| +// Java layer.
|
| +class JniCronetURLRequestContextAdapterDelegate
|
| + : public cronet::CronetURLRequestContextAdapter::
|
| + CronetURLRequestContextAdapterDelegate {
|
| + public:
|
| + JniCronetURLRequestContextAdapterDelegate(JNIEnv* jenv, jobject jowner)
|
| + : owner_(jenv->NewGlobalRef(jowner)) {}
|
| +
|
| + void OnContextInitialized(
|
| + cronet::CronetURLRequestContextAdapter* context_adapter) override {
|
| + JNIEnv* jenv = base::android::AttachCurrentThread();
|
| + cronet::Java_CronetUrlRequestContext_initNetworkThread(jenv, owner_);
|
| + }
|
| +
|
| + protected:
|
| + virtual ~JniCronetURLRequestContextAdapterDelegate() {
|
| + JNIEnv* jenv = base::android::AttachCurrentThread();
|
| + jenv->DeleteGlobalRef(owner_);
|
| + }
|
| +
|
| + private:
|
| + jobject owner_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +namespace cronet {
|
| +
|
| +// Explicitly register static JNI functions.
|
| +bool CronetUrlRequestContextRegisterJni(JNIEnv* jenv) {
|
| + return RegisterNativesImpl(jenv);
|
| +}
|
| +
|
| +// Sets global user-agent to be used for all subsequent requests.
|
| +static jlong CreateRequestContextAdapter(JNIEnv* jenv,
|
| + jobject object,
|
| + jobject japp_context,
|
| + jint jlog_level,
|
| + jstring jconfig) {
|
| + std::string config_string =
|
| + base::android::ConvertJavaStringToUTF8(jenv, jconfig);
|
| +
|
| + scoped_ptr<base::Value> config_value(base::JSONReader::Read(config_string));
|
| + if (!config_value || !config_value->IsType(base::Value::TYPE_DICTIONARY)) {
|
| + DLOG(ERROR) << "Bad JSON: " << config_string;
|
| + return 0;
|
| + }
|
| +
|
| + scoped_ptr<URLRequestContextConfig> context_config(
|
| + new URLRequestContextConfig());
|
| + base::JSONValueConverter<URLRequestContextConfig> converter;
|
| + if (!converter.Convert(*config_value, context_config.get())) {
|
| + DLOG(ERROR) << "Bad Config: " << config_value;
|
| + return 0;
|
| + }
|
| +
|
| + // Set application context.
|
| + base::android::ScopedJavaLocalRef<jobject> scoped_context(jenv, japp_context);
|
| + base::android::InitApplicationContext(jenv, scoped_context);
|
| +
|
| + // TODO(mef): MinLogLevel is global, shared by all URLRequestContexts.
|
| + // Revisit this if each URLRequestContext would need an individual log level.
|
| + logging::SetMinLogLevel(static_cast<int>(jlog_level));
|
| +
|
| + // TODO(dplotnikov): set application context.
|
| + CronetURLRequestContextAdapter* context_adapter =
|
| + new CronetURLRequestContextAdapter(
|
| + new JniCronetURLRequestContextAdapterDelegate(jenv, object));
|
| + context_adapter->AddRef(); // Hold onto this ref-counted object.
|
| + context_adapter->Initialize(context_config.Pass());
|
| + return reinterpret_cast<jlong>(context_adapter);
|
| +}
|
| +
|
| +// Releases native objects.
|
| +static void ReleaseRequestContextAdapter(JNIEnv* jenv,
|
| + jobject jcaller,
|
| + jlong jurl_request_context_adapter) {
|
| + CronetURLRequestContextAdapter* context_adapter =
|
| + reinterpret_cast<CronetURLRequestContextAdapter*>(
|
| + jurl_request_context_adapter);
|
| + // TODO(mef): Revisit this from thread safety point of view: Can we delete a
|
| + // thread while running on that thread?
|
| + // CronetURLRequestContextAdapter is a ref-counted object, and may have
|
| + // pending tasks, so we need to release it instead of deleting here.
|
| + context_adapter->Release();
|
| +}
|
| +
|
| +// Starts recording statistics.
|
| +static void InitializeStatistics(JNIEnv* jenv, jobject jcaller) {
|
| + base::StatisticsRecorder::Initialize();
|
| +}
|
| +
|
| +// Gets current statistics with |filter| as a substring as JSON text (an empty
|
| +// |filter| will include all registered histograms).
|
| +static jstring GetStatisticsJSON(JNIEnv* jenv,
|
| + jobject jcaller,
|
| + jstring jfilter) {
|
| + std::string query = base::android::ConvertJavaStringToUTF8(jenv, jfilter);
|
| + std::string json = base::StatisticsRecorder::ToJSON(query);
|
| + return base::android::ConvertUTF8ToJavaString(jenv, json).Release();
|
| +}
|
| +
|
| +// Starts recording NetLog into file with |fileName|.
|
| +static void StartNetLogToFile(JNIEnv* jenv,
|
| + jobject jcaller,
|
| + jlong jurl_request_context_adapter,
|
| + jstring fileName) {
|
| + CronetURLRequestContextAdapter* context_adapter =
|
| + reinterpret_cast<CronetURLRequestContextAdapter*>(
|
| + jurl_request_context_adapter);
|
| + std::string file_name =
|
| + base::android::ConvertJavaStringToUTF8(jenv, fileName);
|
| + context_adapter->StartNetLogToFile(file_name);
|
| +}
|
| +
|
| +// Stops recording NetLog.
|
| +static void StopNetLog(JNIEnv* jenv,
|
| + jobject jcaller,
|
| + jlong jurl_request_context_adapter) {
|
| + CronetURLRequestContextAdapter* context_adapter =
|
| + reinterpret_cast<CronetURLRequestContextAdapter*>(
|
| + jurl_request_context_adapter);
|
| + context_adapter->StopNetLog();
|
| +}
|
| +
|
| +} // namespace cronet
|
|
|