Upstream version 10.38.222.0
[platform/framework/web/crosswalk.git] / src / webkit / common / data_element.h
1 // Copyright 2013 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 WEBKIT_COMMON_DATA_ELEMENT_H_
6 #define WEBKIT_COMMON_DATA_ELEMENT_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/files/file_path.h"
13 #include "base/logging.h"
14 #include "base/time/time.h"
15 #include "url/gurl.h"
16 #include "webkit/common/webkit_common_export.h"
17
18 namespace webkit_common {
19
20 // Represents a base Web data element. This could be either one of
21 // bytes, file or blob data.
22 class WEBKIT_COMMON_EXPORT DataElement {
23  public:
24   enum Type {
25     TYPE_UNKNOWN = -1,
26     TYPE_BYTES,
27     TYPE_FILE,
28     TYPE_BLOB,
29     TYPE_FILE_FILESYSTEM,
30   };
31
32   DataElement();
33   ~DataElement();
34
35   Type type() const { return type_; }
36   const char* bytes() const { return bytes_ ? bytes_ : &buf_[0]; }
37   const base::FilePath& path() const { return path_; }
38   const GURL& filesystem_url() const { return filesystem_url_; }
39   const std::string& blob_uuid() const { return blob_uuid_; }
40   uint64 offset() const { return offset_; }
41   uint64 length() const { return length_; }
42   const base::Time& expected_modification_time() const {
43     return expected_modification_time_;
44   }
45
46   // Sets TYPE_BYTES data. This copies the given data into the element.
47   void SetToBytes(const char* bytes, int bytes_len) {
48     type_ = TYPE_BYTES;
49     buf_.assign(bytes, bytes + bytes_len);
50     length_ = buf_.size();
51   }
52
53   // Sets TYPE_BYTES data. This does NOT copy the given data and the caller
54   // should make sure the data is alive when this element is accessed.
55   void SetToSharedBytes(const char* bytes, int bytes_len) {
56     type_ = TYPE_BYTES;
57     bytes_ = bytes;
58     length_ = bytes_len;
59   }
60
61   // Sets TYPE_FILE data.
62   void SetToFilePath(const base::FilePath& path) {
63     SetToFilePathRange(path, 0, kuint64max, base::Time());
64   }
65
66   // Sets TYPE_BLOB data.
67   void SetToBlob(const std::string& uuid) {
68     SetToBlobRange(uuid, 0, kuint64max);
69   }
70
71   // Sets TYPE_FILE data with range.
72   void SetToFilePathRange(const base::FilePath& path,
73                           uint64 offset, uint64 length,
74                           const base::Time& expected_modification_time);
75
76   // Sets TYPE_BLOB data with range.
77   void SetToBlobRange(const std::string& blob_uuid,
78                       uint64 offset, uint64 length);
79
80   // Sets TYPE_FILE_FILESYSTEM with range.
81   void SetToFileSystemUrlRange(const GURL& filesystem_url,
82                                uint64 offset, uint64 length,
83                                const base::Time& expected_modification_time);
84
85  private:
86   Type type_;
87   std::vector<char> buf_;  // For TYPE_BYTES.
88   const char* bytes_;  // For TYPE_BYTES.
89   base::FilePath path_;  // For TYPE_FILE.
90   GURL filesystem_url_;  // For TYPE_FILE_FILESYSTEM.
91   std::string blob_uuid_;
92   uint64 offset_;
93   uint64 length_;
94   base::Time expected_modification_time_;
95 };
96
97 #if defined(UNIT_TEST)
98 inline bool operator==(const DataElement& a, const DataElement& b) {
99   if (a.type() != b.type() ||
100       a.offset() != b.offset() ||
101       a.length() != b.length())
102     return false;
103   switch (a.type()) {
104     case DataElement::TYPE_BYTES:
105       return memcmp(a.bytes(), b.bytes(), b.length()) == 0;
106     case DataElement::TYPE_FILE:
107       return a.path() == b.path() &&
108              a.expected_modification_time() == b.expected_modification_time();
109     case DataElement::TYPE_BLOB:
110       return a.blob_uuid() == b.blob_uuid();
111     case DataElement::TYPE_FILE_FILESYSTEM:
112       return a.filesystem_url() == b.filesystem_url();
113     case DataElement::TYPE_UNKNOWN:
114       NOTREACHED();
115       return false;
116   }
117   return false;
118 }
119
120 inline bool operator!=(const DataElement& a, const DataElement& b) {
121   return !(a == b);
122 }
123 #endif  // defined(UNIT_TEST)
124
125 }  // namespace webkit_common
126
127 #endif  // WEBKIT_COMMON_DATA_ELEMENT_H_