blob: e94413692e0a7e735ec0f480c083c7c3a37ee5f7 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SYNC_GLUE_BOOKMARK_CHANGE_PROCESSOR_H_
#define CHROME_BROWSER_SYNC_GLUE_BOOKMARK_CHANGE_PROCESSOR_H_
#include <vector>
#include "base/compiler_specific.h"
#include "chrome/browser/bookmarks/bookmark_model_observer.h"
#include "chrome/browser/sync/glue/bookmark_model_associator.h"
#include "chrome/browser/sync/glue/change_processor.h"
#include "chrome/browser/sync/glue/data_type_error_handler.h"
#include "chrome/browser/sync/glue/sync_backend_host.h"
namespace base {
class RefCountedMemory;
}
namespace syncer {
class WriteNode;
class WriteTransaction;
} // namespace syncer
namespace browser_sync {
// This class is responsible for taking changes from the BookmarkModel
// and applying them to the sync API 'syncable' model, and vice versa.
// All operations and use of this class are from the UI thread.
// This is currently bookmarks specific.
class BookmarkChangeProcessor : public BookmarkModelObserver,
public ChangeProcessor {
public:
BookmarkChangeProcessor(BookmarkModelAssociator* model_associator,
DataTypeErrorHandler* error_handler);
virtual ~BookmarkChangeProcessor();
// BookmarkModelObserver implementation.
// BookmarkModel -> sync API model change application.
virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE;
virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
virtual void BookmarkNodeMoved(BookmarkModel* model,
const BookmarkNode* old_parent,
int old_index,
const BookmarkNode* new_parent,
int new_index) OVERRIDE;
virtual void BookmarkNodeAdded(BookmarkModel* model,
const BookmarkNode* parent,
int index) OVERRIDE;
virtual void BookmarkNodeRemoved(BookmarkModel* model,
const BookmarkNode* parent,
int index,
const BookmarkNode* node) OVERRIDE;
virtual void BookmarkAllNodesRemoved(BookmarkModel* model) OVERRIDE;
virtual void BookmarkNodeChanged(BookmarkModel* model,
const BookmarkNode* node) OVERRIDE;
virtual void BookmarkMetaInfoChanged(BookmarkModel* model,
const BookmarkNode* node) OVERRIDE;
virtual void BookmarkNodeFaviconChanged(BookmarkModel* model,
const BookmarkNode* node) OVERRIDE;
virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
const BookmarkNode* node) OVERRIDE;
// The change processor implementation, responsible for applying changes from
// the sync model to the bookmarks model.
virtual void ApplyChangesFromSyncModel(
const syncer::BaseTransaction* trans,
int64 model_version,
const syncer::ImmutableChangeRecordList& changes) OVERRIDE;
// The following methods are static and hence may be invoked at any time, and
// do not depend on having a running ChangeProcessor.
// Updates the title, URL, creation time and favicon of the bookmark |node|
// with data taken from the |sync_node| sync node.
static void UpdateBookmarkWithSyncData(
const syncer::BaseNode& sync_node,
BookmarkModel* model,
const BookmarkNode* node,
Profile* profile);
// Creates a bookmark node under the given parent node from the given sync
// node. Returns the newly created node. The created node is placed at the
// specified index among the parent's children.
static const BookmarkNode* CreateBookmarkNode(
syncer::BaseNode* sync_node,
const BookmarkNode* parent,
BookmarkModel* model,
Profile* profile,
int index);
// Sets the favicon of the given bookmark node from the given sync node.
// Returns whether the favicon was set in the bookmark node.
// |profile| is the profile that contains the HistoryService and BookmarkModel
// for the bookmark in question.
static bool SetBookmarkFavicon(const syncer::BaseNode* sync_node,
const BookmarkNode* bookmark_node,
BookmarkModel* model,
Profile* profile);
// Applies the 1x favicon |bitmap_data| and |icon_url| to |bookmark_node|.
// |profile| is the profile that contains the HistoryService and BookmarkModel
// for the bookmark in question.
static void ApplyBookmarkFavicon(
const BookmarkNode* bookmark_node,
Profile* profile,
const GURL& icon_url,
const scoped_refptr<base::RefCountedMemory>& bitmap_data);
// Sets the favicon of the given sync node from the given bookmark node.
static void SetSyncNodeFavicon(const BookmarkNode* bookmark_node,
BookmarkModel* model,
syncer::WriteNode* sync_node);
// Treat the |index|th child of |parent| as a newly added node, and create a
// corresponding node in the sync domain using |trans|. All properties
// will be transferred to the new node. A node corresponding to |parent|
// must already exist and be associated for this call to succeed. Returns
// the ID of the just-created node, or if creation fails, kInvalidID.
static int64 CreateSyncNode(const BookmarkNode* parent,
BookmarkModel* model,
int index,
syncer::WriteTransaction* trans,
BookmarkModelAssociator* associator,
DataTypeErrorHandler* error_handler);
// Update transaction version of |model| and |nodes| to |new_version| if
// it's valid.
static void UpdateTransactionVersion(
int64 new_version,
BookmarkModel* model,
const std::vector<const BookmarkNode*>& nodes);
protected:
virtual void StartImpl(Profile* profile) OVERRIDE;
private:
enum MoveOrCreate {
MOVE,
CREATE,
};
// Sets the meta info of the given bookmark node from the given sync node.
static void SetBookmarkMetaInfo(const syncer::BaseNode* sync_node,
const BookmarkNode* bookmark_node,
BookmarkModel* bookmark_model);
// Sets the meta info of the given sync node from the given bookmark node.
static void SetSyncNodeMetaInfo(const BookmarkNode* node,
syncer::WriteNode* sync_node);
// Helper function used to fix the position of a sync node so that it matches
// the position of a corresponding bookmark model node. |parent| and
// |index| identify the bookmark model position. |dst| is the node whose
// position is to be fixed. If |operation| is CREATE, treat |dst| as an
// uncreated node and set its position via InitByCreation(); otherwise,
// |dst| is treated as an existing node, and its position will be set via
// SetPosition(). |trans| is the transaction to which |dst| belongs. Returns
// false on failure.
static bool PlaceSyncNode(MoveOrCreate operation,
const BookmarkNode* parent,
int index,
syncer::WriteTransaction* trans,
syncer::WriteNode* dst,
BookmarkModelAssociator* associator);
// Copy properties (but not position) from |src| to |dst|.
static void UpdateSyncNodeProperties(const BookmarkNode* src,
BookmarkModel* model,
syncer::WriteNode* dst);
// Helper function to encode a bookmark's favicon into raw PNG data.
static void EncodeFavicon(const BookmarkNode* src,
BookmarkModel* model,
scoped_refptr<base::RefCountedMemory>* dst);
// Remove |sync_node|. It should not have any children
void RemoveOneSyncNode(syncer::WriteNode* sync_node);
// Remove all sync nodes, except the permanent nodes.
void RemoveAllSyncNodes();
// Remove all children of the bookmark node with bookmark node id:
// |topmost_node_id|.
void RemoveAllChildNodes(syncer::WriteTransaction* trans,
const int64& topmost_node_id);
// Remove all the sync nodes associated with |node| and its children.
void RemoveSyncNodeHierarchy(const BookmarkNode* node);
// The bookmark model we are processing changes from. Non-NULL when
// |running_| is true.
BookmarkModel* bookmark_model_;
Profile* profile_;
// The two models should be associated according to this ModelAssociator.
BookmarkModelAssociator* model_associator_;
DISALLOW_COPY_AND_ASSIGN(BookmarkChangeProcessor);
};
} // namespace browser_sync
#endif // CHROME_BROWSER_SYNC_GLUE_BOOKMARK_CHANGE_PROCESSOR_H_