- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend_v1 / remote_change_handler.cc
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 #include "chrome/browser/sync_file_system/drive_backend_v1/remote_change_handler.h"
6
7 #include "base/logging.h"
8 #include "webkit/common/fileapi/file_system_util.h"
9
10 namespace sync_file_system {
11
12 RemoteChangeHandler::ChangeQueueItem::ChangeQueueItem()
13     : changestamp(0) {}
14
15 RemoteChangeHandler::ChangeQueueItem::ChangeQueueItem(
16     int64 changestamp,
17     const fileapi::FileSystemURL& url)
18     : changestamp(changestamp), url(url) {}
19
20 bool RemoteChangeHandler::ChangeQueueComparator::operator()(
21     const ChangeQueueItem& left,
22     const ChangeQueueItem& right) {
23   if (left.changestamp != right.changestamp)
24     return left.changestamp < right.changestamp;
25   return fileapi::FileSystemURL::Comparator()(left.url, right.url);
26 }
27
28 RemoteChangeHandler::RemoteChange::RemoteChange()
29     : changestamp(0),
30       change(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_UNKNOWN) {}
31
32 RemoteChangeHandler::RemoteChange::RemoteChange(
33     int64 changestamp,
34     const std::string& resource_id,
35     const std::string& md5_checksum,
36     const base::Time& updated_time,
37     const fileapi::FileSystemURL& url,
38     const FileChange& change)
39     : changestamp(changestamp),
40       resource_id(resource_id),
41       md5_checksum(md5_checksum),
42       updated_time(updated_time),
43       url(url),
44       change(change) {}
45
46 RemoteChangeHandler::RemoteChange::~RemoteChange() {}
47
48 bool RemoteChangeHandler::RemoteChangeComparator::operator()(
49     const RemoteChange& left,
50     const RemoteChange& right) {
51   // This should return true if |right| has higher priority than |left|.
52   // Smaller changestamps have higher priorities (i.e. need to be processed
53   // earlier).
54   if (left.changestamp != right.changestamp)
55     return left.changestamp > right.changestamp;
56   return false;
57 }
58
59 RemoteChangeHandler::RemoteChangeHandler() {}
60
61 RemoteChangeHandler::~RemoteChangeHandler() {}
62
63 bool RemoteChangeHandler::GetChange(RemoteChange* remote_change) {
64   const fileapi::FileSystemURL& url = changes_.begin()->url;
65   const base::FilePath::StringType& normalized_path =
66       fileapi::VirtualPath::GetNormalizedFilePath(url.path());
67   DCHECK(ContainsKey(origin_to_changes_map_, url.origin()));
68   PathToChangeMap* path_to_change = &origin_to_changes_map_[url.origin()];
69   DCHECK(ContainsKey(*path_to_change, normalized_path));
70   *remote_change = (*path_to_change)[normalized_path].remote_change;
71   return true;
72 }
73
74 bool RemoteChangeHandler::GetChangeForURL(
75     const fileapi::FileSystemURL& url,
76     RemoteChange* remote_change) {
77   OriginToChangesMap::iterator found_origin =
78       origin_to_changes_map_.find(url.origin());
79   if (found_origin == origin_to_changes_map_.end())
80     return false;
81
82   PathToChangeMap* path_to_change = &found_origin->second;
83   PathToChangeMap::iterator found_change = path_to_change->find(
84       fileapi::VirtualPath::GetNormalizedFilePath(url.path()));
85   if (found_change == path_to_change->end())
86     return false;
87
88   *remote_change = found_change->second.remote_change;
89   return true;
90 }
91
92 void RemoteChangeHandler::AppendChange(const RemoteChange& remote_change) {
93   base::FilePath::StringType normalized_path =
94       fileapi::VirtualPath::GetNormalizedFilePath(remote_change.url.path());
95
96   PathToChangeMap* path_to_change =
97       &origin_to_changes_map_[remote_change.url.origin()];
98   PathToChangeMap::iterator found = path_to_change->find(normalized_path);
99
100   // Remove an existing change for |remote_change.url.path()|.
101   if (found != path_to_change->end())
102     changes_.erase(found->second.position_in_queue);
103
104   std::pair<PendingChangeQueue::iterator, bool> inserted_to_queue =
105       changes_.insert(ChangeQueueItem(remote_change.changestamp,
106                                       remote_change.url));
107   DCHECK(inserted_to_queue.second);
108
109   (*path_to_change)[normalized_path] =
110       ChangeMapItem(remote_change, inserted_to_queue.first);
111 }
112
113 bool RemoteChangeHandler::RemoveChangeForURL(
114     const fileapi::FileSystemURL& url) {
115   OriginToChangesMap::iterator found_origin =
116       origin_to_changes_map_.find(url.origin());
117   if (found_origin == origin_to_changes_map_.end())
118     return false;
119
120   PathToChangeMap* path_to_change = &found_origin->second;
121   PathToChangeMap::iterator found_change = path_to_change->find(
122       fileapi::VirtualPath::GetNormalizedFilePath(url.path()));
123   if (found_change == path_to_change->end())
124     return false;
125
126   changes_.erase(found_change->second.position_in_queue);
127   path_to_change->erase(found_change);
128   if (path_to_change->empty())
129     origin_to_changes_map_.erase(found_origin);
130   return true;
131 }
132
133 void RemoteChangeHandler::RemoveChangesForOrigin(const GURL& origin) {
134   OriginToChangesMap::iterator found = origin_to_changes_map_.find(origin);
135   if (found == origin_to_changes_map_.end())
136     return;
137   for (PathToChangeMap::iterator itr = found->second.begin();
138        itr != found->second.end(); ++itr)
139     changes_.erase(itr->second.position_in_queue);
140   origin_to_changes_map_.erase(found);
141 }
142
143 bool RemoteChangeHandler::HasChangesForOrigin(const GURL& origin) const {
144   return ContainsKey(origin_to_changes_map_, origin);
145 }
146
147 RemoteChangeHandler::ChangeMapItem::ChangeMapItem() {}
148
149 RemoteChangeHandler::ChangeMapItem::ChangeMapItem(
150     const RemoteChange& remote_change,
151     PendingChangeQueue::iterator position_in_queue)
152   : remote_change(remote_change),
153     position_in_queue(position_in_queue) {}
154
155 RemoteChangeHandler::ChangeMapItem::~ChangeMapItem() {}
156
157 }  // namespace sync_file_system