| 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;
 | 
| -}
 | 
| -
 | 
| 
 |