15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_GLUE_BROWSER_THREAD_MODEL_WORKER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_GLUE_BROWSER_THREAD_MODEL_WORKER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/engine/model_safe_worker.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/syncer_error.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A syncer::ModelSafeWorker for models that accept requests from the
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// syncapi that need to be fulfilled on a browser thread, for example
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// autofill on the DB thread.
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TODO(sync): Try to generalize other ModelWorkers (e.g. history, etc).
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserThreadModelWorker : public syncer::ModelSafeWorker {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThreadModelWorker(content::BrowserThread::ID thread,
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           syncer::ModelSafeGroup group,
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           syncer::WorkerLoopDestructionObserver* observer);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // syncer::ModelSafeWorker implementation. Called on the sync thread.
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void RegisterForLoopDestruction() OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual syncer::ModelSafeGroup GetModelSafeGroup() OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserThreadModelWorker();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual syncer::SyncerError DoWorkAndWaitUntilDoneImpl(
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const syncer::WorkCallback& work) OVERRIDE;
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marked pure virtual so subclasses have to override, but there is
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an implementation that subclasses should use.  This is so that
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (subclass)::CallDoWorkAndSignalTask shows up in callstacks.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallDoWorkAndSignalTask(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::WorkCallback& work,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WaitableEvent* done,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncerError* error) = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::BrowserThread::ID thread_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelSafeGroup group_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserThreadModelWorker);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass BrowserThreadModelWorker so that we can distinguish them
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from stack traces alone.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DatabaseModelWorker : public BrowserThreadModelWorker {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit DatabaseModelWorker(syncer::WorkerLoopDestructionObserver* observer);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallDoWorkAndSignalTask(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::WorkCallback& work,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WaitableEvent* done,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncerError* error) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DatabaseModelWorker();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileModelWorker : public BrowserThreadModelWorker {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit FileModelWorker(syncer::WorkerLoopDestructionObserver* observer);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallDoWorkAndSignalTask(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::WorkCallback& work,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WaitableEvent* done,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncerError* error) OVERRIDE;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FileModelWorker();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace browser_sync
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_GLUE_BROWSER_THREAD_MODEL_WORKER_H_
90