File: local_to_remote_syncer.h

package info (click to toggle)
chromium 135.0.7049.95-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 5,959,392 kB
  • sloc: cpp: 34,198,526; ansic: 7,100,035; javascript: 3,985,800; python: 1,395,489; asm: 896,754; xml: 722,891; pascal: 180,504; sh: 94,909; perl: 88,388; objc: 79,739; sql: 53,020; cs: 41,358; fortran: 24,137; makefile: 22,501; php: 13,699; tcl: 10,142; yacc: 8,822; ruby: 7,350; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; awk: 197; sed: 36
file content (138 lines) | stat: -rw-r--r-- 5,144 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_
#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_

#include <stdint.h>

#include <memory>
#include <string>

#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/sync_file_system/drive_backend/sync_task.h"
#include "chrome/browser/sync_file_system/file_change.h"
#include "chrome/browser/sync_file_system/sync_action.h"
#include "chrome/browser/sync_file_system/sync_file_metadata.h"
#include "google_apis/common/api_error_codes.h"

namespace drive {
class DriveServiceInterface;
class DriveUploaderInterface;
}  // namespace drive

namespace google_apis {
class FileResource;
}

namespace sync_file_system {

namespace drive_backend {

class FileDetails;
class FileTracker;
class FolderCreator;
class MetadataDatabase;
class SyncEngineContext;

class LocalToRemoteSyncer : public SyncTask {
 public:
  typedef base::OnceCallback<void(std::unique_ptr<SyncTaskToken>)> Continuation;

  LocalToRemoteSyncer(SyncEngineContext* sync_context,
                      const SyncFileMetadata& local_metadata,
                      const FileChange& local_change,
                      const base::FilePath& local_path,
                      const storage::FileSystemURL& url);

  LocalToRemoteSyncer(const LocalToRemoteSyncer&) = delete;
  LocalToRemoteSyncer& operator=(const LocalToRemoteSyncer&) = delete;

  ~LocalToRemoteSyncer() override;
  void RunPreflight(std::unique_ptr<SyncTaskToken> token) override;

  const storage::FileSystemURL& url() const { return url_; }
  const base::FilePath& target_path() const { return target_path_; }
  SyncFileType file_type() const { return file_type_; }
  SyncAction sync_action() const { return sync_action_; }
  bool needs_remote_change_listing() const {
    return needs_remote_change_listing_;
  }

 private:
  void MoveToBackground(Continuation continuation,
                        std::unique_ptr<SyncTaskToken> token);
  void ContinueAsBackgroundTask(Continuation continuation,
                                std::unique_ptr<SyncTaskToken> token);
  void SyncCompleted(std::unique_ptr<SyncTaskToken> token,
                     SyncStatusCode status);

  void HandleConflict(std::unique_ptr<SyncTaskToken> token);
  void HandleExistingRemoteFile(std::unique_ptr<SyncTaskToken> token);

  void UpdateTrackerForReusedFolder(const FileDetails& details,
                                    std::unique_ptr<SyncTaskToken> token);

  void DeleteRemoteFile(std::unique_ptr<SyncTaskToken> token);
  void DidDeleteRemoteFile(std::unique_ptr<SyncTaskToken> token,
                           google_apis::ApiErrorCode error);

  void UploadExistingFile(std::unique_ptr<SyncTaskToken> token);
  void DidUploadExistingFile(std::unique_ptr<SyncTaskToken> token,
                             google_apis::ApiErrorCode error,
                             const GURL&,
                             std::unique_ptr<google_apis::FileResource>);
  void UpdateRemoteMetadata(const std::string& file_id,
                            std::unique_ptr<SyncTaskToken> token);
  void DidGetRemoteMetadata(const std::string& file_id,
                            std::unique_ptr<SyncTaskToken> token,
                            google_apis::ApiErrorCode error,
                            std::unique_ptr<google_apis::FileResource> entry);

  void UploadNewFile(std::unique_ptr<SyncTaskToken> token);
  void DidUploadNewFile(std::unique_ptr<SyncTaskToken> token,
                        google_apis::ApiErrorCode error,
                        const GURL& upload_location,
                        std::unique_ptr<google_apis::FileResource> entry);

  void CreateRemoteFolder(std::unique_ptr<SyncTaskToken> token);
  void DidCreateRemoteFolder(std::unique_ptr<SyncTaskToken> token,
                             const std::string& file_id,
                             SyncStatusCode status);
  void DidDetachResourceForCreationConflict(
      std::unique_ptr<SyncTaskToken> token,
      google_apis::ApiErrorCode error);

  bool IsContextReady();
  drive::DriveServiceInterface* drive_service();
  drive::DriveUploaderInterface* drive_uploader();
  MetadataDatabase* metadata_database();

  raw_ptr<SyncEngineContext> sync_context_;  // Not owned.

  FileChange local_change_;
  bool local_is_missing_;
  base::FilePath local_path_;
  storage::FileSystemURL url_;
  SyncFileType file_type_;
  SyncAction sync_action_;

  std::unique_ptr<FileTracker> remote_file_tracker_;
  std::unique_ptr<FileTracker> remote_parent_folder_tracker_;
  base::FilePath target_path_;
  int64_t remote_file_change_id_;

  bool retry_on_success_;
  bool needs_remote_change_listing_;

  std::unique_ptr<FolderCreator> folder_creator_;

  base::WeakPtrFactory<LocalToRemoteSyncer> weak_ptr_factory_{this};
};

}  // namespace drive_backend
}  // namespace sync_file_system

#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_LOCAL_TO_REMOTE_SYNCER_H_