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#ifndef CONTENT_CHILD_THREADEDDATAPROVIDER_IMPL_H_
6#define CONTENT_CHILD_THREADEDDATAPROVIDER_IMPL_H_
7
8#include "base/compiler_specific.h"
9#include "base/memory/linked_ptr.h"
10#include "base/memory/ref_counted.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/memory/shared_memory.h"
13#include "base/memory/weak_ptr.h"
14#include "ipc/ipc_channel.h"
15#include "ipc/message_filter.h"
16
17namespace blink {
18class WebThreadedDataReceiver;
19}
20
21namespace IPC {
22class SyncChannel;
23}
24
25namespace content {
26class WebThreadImpl;
27
28class ThreadedDataProvider {
29 public:
30  ThreadedDataProvider(
31      int request_id,
32      blink::WebThreadedDataReceiver* threaded_data_receiver,
33      linked_ptr<base::SharedMemory> shm_buffer,
34      int shm_size);
35  virtual ~ThreadedDataProvider();
36
37  void Stop();
38  void OnReceivedDataOnBackgroundThread(int data_offset,
39                                        int data_length,
40                                        int encoded_data_length);
41
42  void OnReceivedDataOnForegroundThread(const char* data,
43                                        int data_length,
44                                        int encoded_data_length);
45
46  void OnResourceMessageFilterAddedMainThread();
47
48 private:
49  void StopOnBackgroundThread();
50  void OnResourceMessageFilterAddedBackgroundThread();
51  void ForwardAndACKData(const char* data, int data_length);
52
53  scoped_refptr<IPC::MessageFilter> filter_;
54  int request_id_;
55  linked_ptr<base::SharedMemory> shm_buffer_;
56  int shm_size_;
57  scoped_ptr<base::WeakPtrFactory<ThreadedDataProvider> >
58      background_thread_weak_factory_;
59  WebThreadImpl& background_thread_;
60  IPC::SyncChannel* ipc_channel_;
61  blink::WebThreadedDataReceiver* threaded_data_receiver_;
62  bool resource_filter_active_;
63  base::MessageLoop* main_thread_message_loop_;
64
65  struct QueuedSharedMemoryData {
66    const char* data;
67    int length;
68  };
69  std::vector<QueuedSharedMemoryData> queued_data_;
70
71  base::WeakPtrFactory<ThreadedDataProvider>
72      main_thread_weak_factory_;
73
74  DISALLOW_COPY_AND_ASSIGN(ThreadedDataProvider);
75};
76
77}  // namespace content
78
79#endif  // CONTENT_CHILD_THREADEDDATAPROVIDER_IMPL_H_
80