text: // 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 CONTENT_CHILD_THREADEDDATAPROVIDER_IMPL_H_
  #define CONTENT_CHILD_THREADEDDATAPROVIDER_IMPL_H_
  
  #include "base/compiler_specific.h"
  #include "base/memory/linked_ptr.h"
  #include "base/memory/ref_counted.h"
  #include "base/memory/scoped_ptr.h"
  #include "base/memory/shared_memory.h"
  #include "base/memory/weak_ptr.h"
  #include "ipc/ipc_channel.h"
  #include "ipc/message_filter.h"
  
  namespace blink {
  class WebThreadedDataReceiver;
  }
  
  namespace IPC {
  class SyncChannel;
  }
  
  namespace content {
  class WebThreadImpl;
  
  class ThreadedDataProvider {
   public:
    ThreadedDataProvider(
        int request_id,
        blink::WebThreadedDataReceiver* threaded_data_receiver,
        linked_ptr<base::SharedMemory> shm_buffer,
        int shm_size,
        scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_);
    virtual ~ThreadedDataProvider();
  
    void Stop();
    void OnReceivedDataOnBackgroundThread(int data_offset,
                                          int data_length,
                                          int encoded_data_length);
  
    void OnReceivedDataOnForegroundThread(const char* data,
                                          int data_length,
                                          int encoded_data_length);
  
    void OnResourceMessageFilterAddedMainThread();
  
   private:
    void StopOnBackgroundThread();
    void OnResourceMessageFilterAddedBackgroundThread();
    void ForwardAndACKData(const char* data, int data_length);
  
    scoped_refptr<IPC::MessageFilter> filter_;
    int request_id_;
    linked_ptr<base::SharedMemory> shm_buffer_;
    int shm_size_;
    scoped_ptr<base::WeakPtrFactory<ThreadedDataProvider> >
        background_thread_weak_factory_;
    WebThreadImpl& background_thread_;
    IPC::SyncChannel* ipc_channel_;
    blink::WebThreadedDataReceiver* threaded_data_receiver_;
    bool resource_filter_active_;
    scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
  
    struct QueuedSharedMemoryData {
      const char* data;
      int length;
    };
    std::vector<QueuedSharedMemoryData> queued_data_;
  
    base::WeakPtrFactory<ThreadedDataProvider>
        main_thread_weak_factory_;
  
    DISALLOW_COPY_AND_ASSIGN(ThreadedDataProvider);
  };
  
  }  // namespace content
  
  #endif  // CONTENT_CHILD_THREADEDDATAPROVIDER_IMPL_H_
  