1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.net; 6 7 import android.content.Context; 8 import android.os.ConditionVariable; 9 import android.os.Process; 10 import android.util.Log; 11 12 import org.chromium.base.CalledByNative; 13 import org.chromium.base.JNINamespace; 14 15 /** 16 * Provides context for the native HTTP operations. 17 */ 18 @JNINamespace("cronet") 19 public class UrlRequestContext { 20 private static final int LOG_NONE = 0; 21 private static final int LOG_DEBUG = 1; 22 private static final int LOG_VERBOSE = 2; 23 private static final String LOG_TAG = "ChromiumNetwork"; 24 25 /** 26 * Native peer object, owned by UrlRequestContext. 27 */ 28 private long mUrlRequestContextPeer; 29 30 private final ConditionVariable mStarted = new ConditionVariable(); 31 32 /** 33 * Constructor. 34 * 35 */ UrlRequestContext(Context context, String userAgent, String config)36 protected UrlRequestContext(Context context, String userAgent, 37 String config) { 38 mUrlRequestContextPeer = nativeCreateRequestContextPeer(context, 39 userAgent, getLoggingLevel(), config); 40 if (mUrlRequestContextPeer == 0) 41 throw new NullPointerException("Context Peer creation failed"); 42 43 // TODO(mef): Revisit the need of block here. 44 mStarted.block(2000); 45 } 46 47 /** 48 * Returns the version of this network stack formatted as N.N.N.N/X where 49 * N.N.N.N is the version of Chromium and X is the version of the JNI layer. 50 */ getVersion()51 public static String getVersion() { 52 return nativeGetVersion(); 53 } 54 55 /** 56 * Initializes statistics recorder. 57 */ initializeStatistics()58 public void initializeStatistics() { 59 nativeInitializeStatistics(); 60 } 61 62 /** 63 * Gets current statistics recorded since |initializeStatistics| with 64 * |filter| as a substring as JSON text (an empty |filter| will include all 65 * registered histograms). 66 */ getStatisticsJSON(String filter)67 public String getStatisticsJSON(String filter) { 68 return nativeGetStatisticsJSON(filter); 69 } 70 71 /** 72 * Starts NetLog logging to a file named |fileName| in the 73 * application temporary directory. |fileName| must not be empty. Log level 74 * is LOG_ALL_BUT_BYTES. If the file exists it is truncated before starting. 75 * If actively logging the call is ignored. 76 */ startNetLogToFile(String fileName)77 public void startNetLogToFile(String fileName) { 78 nativeStartNetLogToFile(mUrlRequestContextPeer, fileName); 79 } 80 81 /** 82 * Stops NetLog logging and flushes file to disk. If a logging session is 83 * not in progress this call is ignored. 84 */ stopNetLog()85 public void stopNetLog() { 86 nativeStopNetLog(mUrlRequestContextPeer); 87 } 88 89 @CalledByNative initNetworkThread()90 private void initNetworkThread() { 91 Thread.currentThread().setName("ChromiumNet"); 92 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 93 mStarted.open(); 94 } 95 96 @Override finalize()97 protected void finalize() throws Throwable { 98 nativeReleaseRequestContextPeer(mUrlRequestContextPeer); 99 super.finalize(); 100 } 101 getUrlRequestContextPeer()102 protected long getUrlRequestContextPeer() { 103 return mUrlRequestContextPeer; 104 } 105 106 /** 107 * @return loggingLevel see {@link #LOG_NONE}, {@link #LOG_DEBUG} and 108 * {@link #LOG_VERBOSE}. 109 */ getLoggingLevel()110 private int getLoggingLevel() { 111 int loggingLevel; 112 if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { 113 loggingLevel = LOG_VERBOSE; 114 } else if (Log.isLoggable(LOG_TAG, Log.DEBUG)) { 115 loggingLevel = LOG_DEBUG; 116 } else { 117 loggingLevel = LOG_NONE; 118 } 119 return loggingLevel; 120 } 121 nativeGetVersion()122 private static native String nativeGetVersion(); 123 124 // Returns an instance URLRequestContextPeer to be stored in 125 // mUrlRequestContextPeer. nativeCreateRequestContextPeer(Context context, String userAgent, int loggingLevel, String config)126 private native long nativeCreateRequestContextPeer(Context context, 127 String userAgent, int loggingLevel, String config); 128 nativeReleaseRequestContextPeer( long urlRequestContextPeer)129 private native void nativeReleaseRequestContextPeer( 130 long urlRequestContextPeer); 131 nativeInitializeStatistics()132 private native void nativeInitializeStatistics(); 133 nativeGetStatisticsJSON(String filter)134 private native String nativeGetStatisticsJSON(String filter); 135 nativeStartNetLogToFile(long urlRequestContextPeer, String fileName)136 private native void nativeStartNetLogToFile(long urlRequestContextPeer, 137 String fileName); 138 nativeStopNetLog(long urlRequestContextPeer)139 private native void nativeStopNetLog(long urlRequestContextPeer); 140 } 141