| Index: chrome/browser/bookmark_codec.cc
|
| ===================================================================
|
| --- chrome/browser/bookmark_codec.cc (revision 1903)
|
| +++ chrome/browser/bookmark_codec.cc (working copy)
|
| @@ -1,195 +0,0 @@
|
| -// Copyright (c) 2006-2008 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.
|
| -
|
| -#include "chrome/browser/bookmark_codec.h"
|
| -
|
| -#include "base/string_util.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/bookmark_bar_model.h"
|
| -#include "googleurl/src/gurl.h"
|
| -
|
| -#include "generated_resources.h"
|
| -
|
| -// Key names.
|
| -static const wchar_t* kRootsKey = L"roots";
|
| -static const wchar_t* kRootFolderNameKey = L"bookmark_bar";
|
| -static const wchar_t* kOtherBookmarFolderNameKey = L"other";
|
| -static const wchar_t* kVersionKey = L"version";
|
| -static const wchar_t* kTypeKey = L"type";
|
| -static const wchar_t* kNameKey = L"name";
|
| -static const wchar_t* kDateAddedKey = L"date_added";
|
| -static const wchar_t* kURLKey = L"url";
|
| -static const wchar_t* kDateModifiedKey = L"date_modified";
|
| -static const wchar_t* kChildrenKey = L"children";
|
| -
|
| -// Possible values for kTypeKey.
|
| -static const wchar_t* kTypeURL = L"url";
|
| -static const wchar_t* kTypeFolder = L"folder";
|
| -
|
| -// Current version of the file.
|
| -static const int kCurrentVersion = 1;
|
| -
|
| -Value* BookmarkCodec::Encode(BookmarkBarModel* model) {
|
| - return Encode(model->GetBookmarkBarNode(), model->other_node());
|
| -}
|
| -
|
| -Value* BookmarkCodec::Encode(BookmarkBarNode* bookmark_bar_node,
|
| - BookmarkBarNode* other_folder_node) {
|
| - DictionaryValue* roots = new DictionaryValue();
|
| - roots->Set(kRootFolderNameKey, EncodeNode(bookmark_bar_node));
|
| - roots->Set(kOtherBookmarFolderNameKey, EncodeNode(other_folder_node));
|
| -
|
| - DictionaryValue* main = new DictionaryValue();
|
| - main->SetInteger(kVersionKey, kCurrentVersion);
|
| - main->Set(kRootsKey, roots);
|
| - return main;
|
| -}
|
| -
|
| -bool BookmarkCodec::Decode(BookmarkBarModel* model, const Value& value) {
|
| - if (value.GetType() != Value::TYPE_DICTIONARY)
|
| - return false; // Unexpected type.
|
| -
|
| - const DictionaryValue& d_value = static_cast<const DictionaryValue&>(value);
|
| -
|
| - int version;
|
| - if (!d_value.GetInteger(kVersionKey, &version) || version != kCurrentVersion)
|
| - return false; // Unknown version.
|
| -
|
| - Value* roots;
|
| - if (!d_value.Get(kRootsKey, &roots))
|
| - return false; // No roots.
|
| -
|
| - if (roots->GetType() != Value::TYPE_DICTIONARY)
|
| - return false; // Invalid type for roots.
|
| -
|
| - DictionaryValue* roots_d_value = static_cast<DictionaryValue*>(roots);
|
| - Value* root_folder_value;
|
| - Value* other_folder_value;
|
| - if (!roots_d_value->Get(kRootFolderNameKey, &root_folder_value) ||
|
| - root_folder_value->GetType() != Value::TYPE_DICTIONARY ||
|
| - !roots_d_value->Get(kOtherBookmarFolderNameKey, &other_folder_value) ||
|
| - other_folder_value->GetType() != Value::TYPE_DICTIONARY)
|
| - return false; // Invalid type for root folder and/or other folder.
|
| -
|
| - DecodeNode(model, *static_cast<DictionaryValue*>(root_folder_value),
|
| - NULL, model->GetBookmarkBarNode());
|
| - DecodeNode(model, *static_cast<DictionaryValue*>(other_folder_value),
|
| - NULL, model->other_node());
|
| - // Need to reset the type as decoding resets the type to FOLDER. Similarly
|
| - // we need to reset the title as the title is persisted and restored from
|
| - // the file.
|
| - model->GetBookmarkBarNode()->type_ = history::StarredEntry::BOOKMARK_BAR;
|
| - model->other_node()->type_ = history::StarredEntry::OTHER;
|
| - model->GetBookmarkBarNode()->SetTitle(
|
| - l10n_util::GetString(IDS_BOOMARK_BAR_FOLDER_NAME));
|
| - model->other_node()->SetTitle(
|
| - l10n_util::GetString(IDS_BOOMARK_BAR_OTHER_FOLDER_NAME));
|
| - return true;
|
| -}
|
| -
|
| -Value* BookmarkCodec::EncodeNode(BookmarkBarNode* node) {
|
| - DictionaryValue* value = new DictionaryValue();
|
| - value->SetString(kNameKey, node->GetTitle());
|
| - value->SetString(kDateAddedKey,
|
| - Int64ToWString(node->date_added().ToInternalValue()));
|
| - if (node->GetType() == history::StarredEntry::URL) {
|
| - value->SetString(kTypeKey, kTypeURL);
|
| - value->SetString(kURLKey,
|
| - UTF8ToWide(node->GetURL().possibly_invalid_spec()));
|
| - } else {
|
| - value->SetString(kTypeKey, kTypeFolder);
|
| - value->SetString(kDateModifiedKey,
|
| - Int64ToWString(node->date_group_modified().
|
| - ToInternalValue()));
|
| -
|
| - ListValue* child_values = new ListValue();
|
| - value->Set(kChildrenKey, child_values);
|
| - for (int i = 0; i < node->GetChildCount(); ++i)
|
| - child_values->Append(EncodeNode(node->GetChild(i)));
|
| - }
|
| - return value;
|
| -}
|
| -
|
| -bool BookmarkCodec::DecodeChildren(BookmarkBarModel* model,
|
| - const ListValue& child_value_list,
|
| - BookmarkBarNode* parent) {
|
| - for (size_t i = 0; i < child_value_list.GetSize(); ++i) {
|
| - Value* child_value;
|
| - if (!child_value_list.Get(i, &child_value))
|
| - return false;
|
| -
|
| - if (child_value->GetType() != Value::TYPE_DICTIONARY)
|
| - return false;
|
| -
|
| - if (!DecodeNode(model, *static_cast<DictionaryValue*>(child_value), parent,
|
| - NULL)) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool BookmarkCodec::DecodeNode(BookmarkBarModel* model,
|
| - const DictionaryValue& value,
|
| - BookmarkBarNode* parent,
|
| - BookmarkBarNode* node) {
|
| - bool created_node = (node == NULL);
|
| - std::wstring title;
|
| - if (!value.GetString(kNameKey, &title))
|
| - return false;
|
| -
|
| - // TODO(sky): this should be more flexible. Don't hoark if we can't parse it
|
| - // all.
|
| - std::wstring date_added_string;
|
| - if (!value.GetString(kDateAddedKey, &date_added_string))
|
| - return false;
|
| -
|
| - std::wstring type_string;
|
| - if (!value.GetString(kTypeKey, &type_string))
|
| - return false;
|
| -
|
| - if (type_string != kTypeURL && type_string != kTypeFolder)
|
| - return false; // Unknown type.
|
| -
|
| - if (type_string == kTypeURL) {
|
| - std::wstring url_string;
|
| - if (!value.GetString(kURLKey, &url_string))
|
| - return false;
|
| - // TODO(sky): this should ignore the node if not a valid URL.
|
| - if (!node)
|
| - node = new BookmarkBarNode(model, GURL(url_string));
|
| - if (parent)
|
| - parent->Add(parent->GetChildCount(), node);
|
| - node->type_ = history::StarredEntry::URL;
|
| - } else {
|
| - std::wstring last_modified_date;
|
| - if (!value.GetString(kDateModifiedKey, &last_modified_date))
|
| - return false;
|
| -
|
| - Value* child_values;
|
| - if (!value.Get(kChildrenKey, &child_values))
|
| - return false;
|
| -
|
| - if (child_values->GetType() != Value::TYPE_LIST)
|
| - return false;
|
| -
|
| - if (!node)
|
| - node = new BookmarkBarNode(model, GURL());
|
| - node->type_ = history::StarredEntry::USER_GROUP;
|
| - node->date_group_modified_ =
|
| - Time::FromInternalValue(StringToInt64(last_modified_date));
|
| -
|
| - if (parent)
|
| - parent->Add(parent->GetChildCount(), node);
|
| -
|
| - if (!DecodeChildren(model, *static_cast<ListValue*>(child_values), node))
|
| - return false;
|
| - }
|
| -
|
| - node->SetTitle(title);
|
| - node->date_added_ =
|
| - Time::FromInternalValue(StringToInt64(date_added_string));
|
| - return true;
|
| -}
|
| -
|
|
|