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_COMMON_RESOURCE_REQUEST_BODY_H_
6#define CONTENT_COMMON_RESOURCE_REQUEST_BODY_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/memory/ref_counted.h"
12#include "base/supports_user_data.h"
13#include "content/common/content_export.h"
14#include "storage/common/data_element.h"
15#include "url/gurl.h"
16
17namespace base {
18class FilePath;
19}
20
21namespace content {
22
23// A struct used to represent upload data. The data field is populated by
24// WebURLLoader from the data given as WebHTTPBody.
25class CONTENT_EXPORT ResourceRequestBody
26    : public base::RefCountedThreadSafe<ResourceRequestBody>,
27      public base::SupportsUserData {
28 public:
29  typedef storage::DataElement Element;
30
31  ResourceRequestBody();
32
33  void AppendBytes(const char* bytes, int bytes_len);
34  void AppendFileRange(const base::FilePath& file_path,
35                       uint64 offset, uint64 length,
36                       const base::Time& expected_modification_time);
37  void AppendBlob(const std::string& uuid);
38  void AppendFileSystemFileRange(const GURL& url, uint64 offset, uint64 length,
39                                 const base::Time& expected_modification_time);
40
41  const std::vector<Element>* elements() const { return &elements_; }
42  std::vector<Element>* elements_mutable() { return &elements_; }
43  void swap_elements(std::vector<Element>* elements) {
44    elements_.swap(*elements);
45  }
46
47  // Identifies a particular upload instance, which is used by the cache to
48  // formulate a cache key.  This value should be unique across browser
49  // sessions.  A value of 0 is used to indicate an unspecified identifier.
50  void set_identifier(int64 id) { identifier_ = id; }
51  int64 identifier() const { return identifier_; }
52
53 private:
54  friend class base::RefCountedThreadSafe<ResourceRequestBody>;
55  virtual ~ResourceRequestBody();
56
57  std::vector<Element> elements_;
58  int64 identifier_;
59
60  DISALLOW_COPY_AND_ASSIGN(ResourceRequestBody);
61};
62
63}  // namespace content
64
65#endif  // CONTENT_COMMON_RESOURCE_REQUEST_BODY_H_
66