- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend_v1 / local_sync_operation_resolver.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/local_sync_operation_resolver.h"
6
7 #include "base/logging.h"
8 #include "chrome/browser/sync_file_system/drive_backend_v1/drive_file_sync_service.h"
9 #include "chrome/browser/sync_file_system/sync_file_system.pb.h"
10
11 namespace sync_file_system {
12
13 SyncOperationType LocalSyncOperationResolver::Resolve(
14     const FileChange& local_file_change,
15     const FileChange* remote_file_change,
16     const DriveMetadata* drive_metadata) {
17   // Invalid combination should never happen.
18   if (remote_file_change && remote_file_change->IsTypeUnknown())
19     return SYNC_OPERATION_FAIL;
20
21   bool is_conflicting = false;
22   SyncFileType remote_file_type_in_metadata = SYNC_FILE_TYPE_UNKNOWN;
23   if (drive_metadata) {
24     is_conflicting = drive_metadata->conflicted();
25     remote_file_type_in_metadata =
26         DriveFileSyncService::DriveMetadataResourceTypeToSyncFileType(
27             drive_metadata->type());
28   }
29
30   switch (local_file_change.change()) {
31     case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
32       switch (local_file_change.file_type()) {
33         case SYNC_FILE_TYPE_FILE:
34           return is_conflicting
35               ? ResolveForAddOrUpdateFileInConflict(remote_file_change)
36               : ResolveForAddOrUpdateFile(remote_file_change,
37                                           remote_file_type_in_metadata);
38         case SYNC_FILE_TYPE_DIRECTORY:
39           return is_conflicting
40               ? ResolveForAddDirectoryInConflict()
41               : ResolveForAddDirectory(remote_file_change,
42                                        remote_file_type_in_metadata);
43         case SYNC_FILE_TYPE_UNKNOWN:
44           NOTREACHED() << "Adding unknown type of local file.";
45           return SYNC_OPERATION_FAIL;
46       }
47     case FileChange::FILE_CHANGE_DELETE:
48       return is_conflicting
49           ? ResolveForDeleteInConflict(remote_file_change)
50           : ResolveForDelete(remote_file_change,
51                              remote_file_type_in_metadata);
52   }
53   NOTREACHED() << "Detected unknown type of change for local file.";
54   return SYNC_OPERATION_FAIL;
55 }
56
57 SyncOperationType LocalSyncOperationResolver::ResolveForAddOrUpdateFile(
58     const FileChange* remote_file_change,
59     SyncFileType remote_file_type_in_metadata) {
60   if (!remote_file_change) {
61     switch (remote_file_type_in_metadata) {
62       case SYNC_FILE_TYPE_UNKNOWN:
63         // Remote file or directory may not exist.
64         return SYNC_OPERATION_ADD_FILE;
65       case SYNC_FILE_TYPE_FILE:
66         return SYNC_OPERATION_UPDATE_FILE;
67       case SYNC_FILE_TYPE_DIRECTORY:
68         return SYNC_OPERATION_RESOLVE_TO_REMOTE;
69     }
70     NOTREACHED() << "Detected local add-or-update to"
71                  << " unknown type of remote file.";
72     return SYNC_OPERATION_FAIL;
73   }
74
75   switch (remote_file_change->change()) {
76     case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
77       if (remote_file_change->IsFile())
78         return SYNC_OPERATION_CONFLICT;
79       return SYNC_OPERATION_RESOLVE_TO_REMOTE;
80     case FileChange::FILE_CHANGE_DELETE:
81       return SYNC_OPERATION_RESOLVE_TO_LOCAL;
82   }
83
84   NOTREACHED() << "Local add-or-update conflicted to"
85                << " unknown type of remote change.";
86   return SYNC_OPERATION_FAIL;
87 }
88
89 SyncOperationType
90 LocalSyncOperationResolver::ResolveForAddOrUpdateFileInConflict(
91     const FileChange* remote_file_change) {
92   if (!remote_file_change)
93     return SYNC_OPERATION_CONFLICT;
94   switch (remote_file_change->change()) {
95     case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
96       if (remote_file_change->IsFile())
97         return SYNC_OPERATION_CONFLICT;
98       return SYNC_OPERATION_RESOLVE_TO_REMOTE;
99     case FileChange::FILE_CHANGE_DELETE:
100       return SYNC_OPERATION_RESOLVE_TO_LOCAL;
101   }
102   NOTREACHED() << "Local add-or-update for conflicting file conflicted to"
103                << " unknown type of remote change.";
104   return SYNC_OPERATION_FAIL;
105 }
106
107 SyncOperationType LocalSyncOperationResolver::ResolveForAddDirectory(
108     const FileChange* remote_file_change,
109     SyncFileType remote_file_type_in_metadata) {
110   if (!remote_file_change) {
111     switch (remote_file_type_in_metadata) {
112       case SYNC_FILE_TYPE_UNKNOWN:
113         // Remote file or directory may not exist.
114         return SYNC_OPERATION_ADD_DIRECTORY;
115       case SYNC_FILE_TYPE_FILE:
116         return SYNC_OPERATION_RESOLVE_TO_LOCAL;
117       case SYNC_FILE_TYPE_DIRECTORY:
118         return SYNC_OPERATION_NONE;
119     }
120     NOTREACHED() << "Local add directory conflicted to"
121                  << " unknown type of remote file.";
122     return SYNC_OPERATION_FAIL;
123   }
124
125   switch (remote_file_change->change()) {
126     case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
127       if (remote_file_change->IsFile())
128         return SYNC_OPERATION_RESOLVE_TO_LOCAL;
129       return SYNC_OPERATION_NONE;
130     case FileChange::FILE_CHANGE_DELETE:
131       if (remote_file_change->IsFile())
132         return SYNC_OPERATION_ADD_DIRECTORY;
133       return SYNC_OPERATION_RESOLVE_TO_LOCAL;
134   }
135
136   NOTREACHED() << "Local add directory conflicted to"
137                << " unknown type of remote change.";
138   return SYNC_OPERATION_FAIL;
139 }
140
141 SyncOperationType
142 LocalSyncOperationResolver::ResolveForAddDirectoryInConflict() {
143   return SYNC_OPERATION_RESOLVE_TO_LOCAL;
144 }
145
146 SyncOperationType LocalSyncOperationResolver::ResolveForDelete(
147     const FileChange* remote_file_change,
148     SyncFileType remote_file_type_in_metadata) {
149   if (!remote_file_change)
150     return SYNC_OPERATION_DELETE;
151
152   switch (remote_file_change->change()) {
153     case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
154       return SYNC_OPERATION_RESOLVE_TO_REMOTE;
155     case FileChange::FILE_CHANGE_DELETE:
156       return SYNC_OPERATION_DELETE_METADATA;
157   }
158
159   NOTREACHED() << "Local file deletion conflicted to"
160                << " unknown type of remote change.";
161   return SYNC_OPERATION_FAIL;
162 }
163
164 SyncOperationType LocalSyncOperationResolver::ResolveForDeleteInConflict(
165     const FileChange* remote_file_change) {
166   if (!remote_file_change)
167     return SYNC_OPERATION_RESOLVE_TO_REMOTE;
168   switch (remote_file_change->change()) {
169     case FileChange::FILE_CHANGE_ADD_OR_UPDATE:
170       return SYNC_OPERATION_RESOLVE_TO_REMOTE;
171     case FileChange::FILE_CHANGE_DELETE:
172       return SYNC_OPERATION_DELETE_METADATA;
173   }
174   NOTREACHED() << "Local file deletion for conflicting file conflicted to"
175                << " unknown type of remote change.";
176   return SYNC_OPERATION_FAIL;
177 }
178
179 }  // namespace sync_file_system