1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#ifndef COMPONENTS_CRONET_ANDROID_URL_REQUEST_CONTEXT_ADAPTER_H_
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define COMPONENTS_CRONET_ANDROID_URL_REQUEST_CONTEXT_ADAPTER_H_
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <string>
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/compiler_specific.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/macros.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/threading/thread.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/net_log.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/network_change_notifier.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/url_request/url_request_context.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace net {
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass NetLogLogger;
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace net
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace cronet {
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct URLRequestContextConfig;
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Implementation of the Chromium NetLog observer interface.
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class NetLogObserver : public net::NetLog::ThreadSafeObserver {
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  explicit NetLogObserver() {}
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~NetLogObserver() {}
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE;
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetLogObserver);
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Fully configured |URLRequestContext|.
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class URLRequestContextAdapter : public net::URLRequestContextGetter {
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  class URLRequestContextAdapterDelegate
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      : public base::RefCountedThreadSafe<URLRequestContextAdapterDelegate> {
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   public:
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    virtual void OnContextInitialized(URLRequestContextAdapter* context) = 0;
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   protected:
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    friend class base::RefCountedThreadSafe<URLRequestContextAdapterDelegate>;
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    virtual ~URLRequestContextAdapterDelegate() {}
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  URLRequestContextAdapter(URLRequestContextAdapterDelegate* delegate,
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           std::string user_agent);
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Initialize(scoped_ptr<URLRequestContextConfig> config);
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::string& GetUserAgent(const GURL& url) const;
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // net::URLRequestContextGetter implementation:
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE;
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const OVERRIDE;
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void StartNetLogToFile(const std::string& file_name);
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void StopNetLog();
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<URLRequestContextAdapterDelegate> delegate_;
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<net::URLRequestContext> context_;
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string user_agent_;
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::Thread* network_thread_;
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<NetLogObserver> net_log_observer_;
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<net::NetLogLogger> net_log_logger_;
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~URLRequestContextAdapter();
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Initializes |context_| on the Network thread.
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void InitializeURLRequestContext(scoped_ptr<URLRequestContextConfig> config);
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLRequestContextAdapter);
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace cronet
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif  // COMPONENTS_CRONET_ANDROID_URL_REQUEST_CONTEXT_ADAPTER_H_
89