15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/drive_backend/remote_change_processor_on_worker.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/location.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/weak_ptr.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/single_thread_task_runner.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/drive_backend/callback_helper.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/drive_backend/remote_change_processor_wrapper.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/file_change.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/sync_file_metadata.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace sync_file_system {
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace drive_backend {
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuRemoteChangeProcessorOnWorker::RemoteChangeProcessorOnWorker(
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const base::WeakPtr<RemoteChangeProcessorWrapper>& wrapper,
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::SingleThreadTaskRunner* ui_task_runner,
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::SequencedTaskRunner* worker_task_runner)
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : wrapper_(wrapper),
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ui_task_runner_(ui_task_runner),
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      worker_task_runner_(worker_task_runner) {
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  sequence_checker_.DetachFromSequence();
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)RemoteChangeProcessorOnWorker::~RemoteChangeProcessorOnWorker() {
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(sequence_checker_.CalledOnValidSequencedThread());
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RemoteChangeProcessorOnWorker::PrepareForProcessRemoteChange(
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const PrepareChangeCallback& callback) {
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(sequence_checker_.CalledOnValidSequencedThread());
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_task_runner_->PostTask(
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      FROM_HERE,
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&RemoteChangeProcessorWrapper::PrepareForProcessRemoteChange,
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 wrapper_,
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 url,
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 RelayCallbackToTaskRunner(
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     worker_task_runner_.get(), FROM_HERE, callback)));
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RemoteChangeProcessorOnWorker::ApplyRemoteChange(
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const FileChange& change,
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::FilePath& local_path,
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const SyncStatusCallback& callback) {
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(sequence_checker_.CalledOnValidSequencedThread());
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_task_runner_->PostTask(
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      FROM_HERE,
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&RemoteChangeProcessorWrapper::ApplyRemoteChange,
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 wrapper_,
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 change,
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 local_path,
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 url,
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 RelayCallbackToTaskRunner(
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     worker_task_runner_.get(), FROM_HERE, callback)));
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RemoteChangeProcessorOnWorker::FinalizeRemoteSync(
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    bool clear_local_changes,
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const base::Closure& completion_callback) {
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(sequence_checker_.CalledOnValidSequencedThread());
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_task_runner_->PostTask(
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      FROM_HERE,
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &RemoteChangeProcessorWrapper::FinalizeRemoteSync,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          wrapper_,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          url,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          clear_local_changes,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          RelayCallbackToTaskRunner(
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              worker_task_runner_.get(), FROM_HERE, completion_callback)));
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RemoteChangeProcessorOnWorker::RecordFakeLocalChange(
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const FileChange& change,
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const SyncStatusCallback& callback) {
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(sequence_checker_.CalledOnValidSequencedThread());
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_task_runner_->PostTask(
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      FROM_HERE,
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&RemoteChangeProcessorWrapper::RecordFakeLocalChange,
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 wrapper_,
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 url,
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 change,
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 RelayCallbackToTaskRunner(
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     worker_task_runner_.get(), FROM_HERE, callback)));
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RemoteChangeProcessorOnWorker::DetachFromSequence() {
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  sequence_checker_.DetachFromSequence();
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace drive_backend
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace sync_file_system
104