C++程序  |  147行  |  5.14 KB

// Copyright (c) 2013 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 PPAPI_PROXY_URL_LOADER_RESOURCE_H_
#define PPAPI_PROXY_URL_LOADER_RESOURCE_H_

#include <deque>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "ppapi/c/trusted/ppb_url_loader_trusted.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_proxy_export.h"
#include "ppapi/shared_impl/url_request_info_data.h"
#include "ppapi/thunk/ppb_url_loader_api.h"

namespace ppapi {
namespace proxy {

class URLResponseInfoResource;

class PPAPI_PROXY_EXPORT URLLoaderResource
    : public PluginResource,
      public NON_EXPORTED_BASE(thunk::PPB_URLLoader_API) {
 public:
  // Constructor for plugin-initiated loads.
  URLLoaderResource(Connection connection,
                    PP_Instance instance);

  // Constructor for renderer-initiated (document) loads. The loader ID is the
  // pending host ID for the already-created host in the renderer, and the
  // response data is the response for the already-opened connection.
  URLLoaderResource(Connection connection,
                    PP_Instance instance,
                    int pending_main_document_loader_id,
                    const URLResponseInfoData& data);

  virtual ~URLLoaderResource();

  // Resource override.
  thunk::PPB_URLLoader_API* AsPPB_URLLoader_API() OVERRIDE;

  // PPB_URLLoader_API implementation.
  virtual int32_t Open(PP_Resource request_id,
                       scoped_refptr<TrackedCallback> callback) OVERRIDE;
  virtual int32_t Open(const URLRequestInfoData& data,
                       int requestor_pid,
                       scoped_refptr<TrackedCallback> callback) OVERRIDE;
  virtual int32_t FollowRedirect(
      scoped_refptr<TrackedCallback> callback) OVERRIDE;
  virtual PP_Bool GetUploadProgress(int64_t* bytes_sent,
                                    int64_t* total_bytes_to_be_sent) OVERRIDE;
  virtual PP_Bool GetDownloadProgress(
      int64_t* bytes_received,
      int64_t* total_bytes_to_be_received) OVERRIDE;
  virtual PP_Resource GetResponseInfo() OVERRIDE;
  virtual int32_t ReadResponseBody(
      void* buffer,
      int32_t bytes_to_read,
      scoped_refptr<TrackedCallback> callback) OVERRIDE;
  virtual int32_t FinishStreamingToFile(
      scoped_refptr<TrackedCallback> callback) OVERRIDE;
  virtual void Close() OVERRIDE;
  virtual void GrantUniversalAccess() OVERRIDE;
  virtual void RegisterStatusCallback(
      PP_URLLoaderTrusted_StatusCallback callback) OVERRIDE;

  // PluginResource implementation.
  virtual void OnReplyReceived(const ResourceMessageReplyParams& params,
                               const IPC::Message& msg) OVERRIDE;

 private:
  enum Mode {
    // The plugin has not called Open() yet.
    MODE_WAITING_TO_OPEN,

    // The plugin is waiting for the Open() or FollowRedirect callback.
    MODE_OPENING,

    // We've started to receive data and may receive more.
    MODE_STREAMING_DATA,

    // All data has been streamed or there was an error.
    MODE_LOAD_COMPLETE
  };

  // IPC message handlers.
  void OnPluginMsgReceivedResponse(const ResourceMessageReplyParams& params,
                                   const URLResponseInfoData& data);
  void OnPluginMsgSendData(const ResourceMessageReplyParams& params,
                           const IPC::Message& message);
  void OnPluginMsgFinishedLoading(const ResourceMessageReplyParams& params,
                                  int32_t result);
  void OnPluginMsgUpdateProgress(const ResourceMessageReplyParams& params,
                                 int64_t bytes_sent,
                                 int64_t total_bytes_to_be_sent,
                                 int64_t bytes_received,
                                 int64_t total_bytes_to_be_received);

  // Sends the defers loading message to the renderer to block or unblock the
  // load.
  void SetDefersLoading(bool defers_loading);

  int32_t ValidateCallback(scoped_refptr<TrackedCallback> callback);

  // Sets up |callback| as the pending callback. This should only be called once
  // it is certain that |PP_OK_COMPLETIONPENDING| will be returned.
  void RegisterCallback(scoped_refptr<TrackedCallback> callback);

  void RunCallback(int32_t result);

  // Saves the given response info to response_info_, handling file refs if
  // necessary. This does not issue any callbacks.
  void SaveResponseInfo(const URLResponseInfoData& data);

  size_t FillUserBuffer();

  Mode mode_;
  URLRequestInfoData request_data_;

  scoped_refptr<TrackedCallback> pending_callback_;

  PP_URLLoaderTrusted_StatusCallback status_callback_;

  std::deque<char> buffer_;
  int64_t bytes_sent_;
  int64_t total_bytes_to_be_sent_;
  int64_t bytes_received_;
  int64_t total_bytes_to_be_received_;
  char* user_buffer_;
  size_t user_buffer_size_;
  int32_t done_status_;
  bool is_streaming_to_file_;
  bool is_asynchronous_load_suspended_;

  // The response info if we've received it.
  scoped_refptr<URLResponseInfoResource> response_info_;

  DISALLOW_COPY_AND_ASSIGN(URLLoaderResource);
};

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_URL_LOADER_RESOURCE_H_