| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |  | 
| 2 // Use of this source code is governed by a BSD-style license that can be |  | 
| 3 // found in the LICENSE file. |  | 
| 4 |  | 
| 5 #include "base/pickle.h" |  | 
| 6 #include "chrome/browser/bookmark_bar_model.h" |  | 
| 7 #include "chrome/browser/bookmark_drag_data.h" |  | 
| 8 #include "chrome/common/os_exchange_data.h" |  | 
| 9 |  | 
| 10 static CLIPFORMAT clipboard_format = 0; |  | 
| 11 |  | 
| 12 static void RegisterFormat() { |  | 
| 13   if (clipboard_format == 0) { |  | 
| 14     clipboard_format = RegisterClipboardFormat(L"chrome/x-bookmark-entry"); |  | 
| 15     DCHECK(clipboard_format); |  | 
| 16   } |  | 
| 17 } |  | 
| 18 |  | 
| 19 BookmarkDragData::BookmarkDragData() : is_url(false), is_valid(false) { |  | 
| 20 } |  | 
| 21 |  | 
| 22 BookmarkDragData::BookmarkDragData(BookmarkBarNode* node) |  | 
| 23     : is_url(node->GetType() == history::StarredEntry::URL), |  | 
| 24       url(node->GetURL()), |  | 
| 25       title(node->GetTitle()), |  | 
| 26       is_valid(true), |  | 
| 27       id_(node->id()) { |  | 
| 28   if (!is_url) |  | 
| 29     AddChildren(node); |  | 
| 30 } |  | 
| 31 |  | 
| 32 void BookmarkDragData::Write(OSExchangeData* data) const { |  | 
| 33   RegisterFormat(); |  | 
| 34 |  | 
| 35   DCHECK(data); |  | 
| 36 |  | 
| 37   if (is_url) { |  | 
| 38     data->SetURL(url, title); |  | 
| 39   } |  | 
| 40   Pickle data_pickle; |  | 
| 41   WriteToPickle(&data_pickle); |  | 
| 42   data->SetPickledData(clipboard_format, data_pickle); |  | 
| 43 } |  | 
| 44 |  | 
| 45 bool BookmarkDragData::Read(const OSExchangeData& data) { |  | 
| 46   RegisterFormat(); |  | 
| 47 |  | 
| 48   is_valid = data.GetURLAndTitle(&url, &title) && url.is_valid(); |  | 
| 49   is_url = is_valid; |  | 
| 50   profile_id.clear(); |  | 
| 51 |  | 
| 52   if (data.HasFormat(clipboard_format)) { |  | 
| 53     Pickle drag_data_pickle; |  | 
| 54     if (data.GetPickledData(clipboard_format, &drag_data_pickle)) { |  | 
| 55       void* data_iterator = NULL; |  | 
| 56       if (ReadFromPickle(&drag_data_pickle, &data_iterator)) { |  | 
| 57         is_valid = true; |  | 
| 58       } |  | 
| 59     } |  | 
| 60   } |  | 
| 61   return is_valid; |  | 
| 62 } |  | 
| 63 |  | 
| 64 BookmarkBarNode* BookmarkDragData::GetNode(BookmarkBarModel* model) const { |  | 
| 65   DCHECK(!is_url && id_ && is_valid); |  | 
| 66   return model->GetNodeByID(id_); |  | 
| 67 } |  | 
| 68 |  | 
| 69 void BookmarkDragData::WriteToPickle(Pickle* pickle) const { |  | 
| 70   pickle->WriteBool(is_url); |  | 
| 71   pickle->WriteWString(profile_id); |  | 
| 72   pickle->WriteString(url.spec()); |  | 
| 73   pickle->WriteWString(title); |  | 
| 74   if (!is_url) { |  | 
| 75     pickle->WriteInt(id_); |  | 
| 76     pickle->WriteInt(static_cast<int>(children.size())); |  | 
| 77     for (std::vector<BookmarkDragData>::const_iterator i = children.begin(); |  | 
| 78          i != children.end(); ++i) { |  | 
| 79       i->WriteToPickle(pickle); |  | 
| 80     } |  | 
| 81   } |  | 
| 82 } |  | 
| 83 |  | 
| 84 bool BookmarkDragData::ReadFromPickle(Pickle* pickle, void** iterator) { |  | 
| 85   std::string url_spec; |  | 
| 86   is_valid = false; |  | 
| 87   if (!pickle->ReadBool(iterator, &is_url) || |  | 
| 88       !pickle->ReadWString(iterator, &profile_id) || |  | 
| 89       !pickle->ReadString(iterator, &url_spec) || |  | 
| 90       !pickle->ReadWString(iterator, &title)) { |  | 
| 91     return false; |  | 
| 92   } |  | 
| 93   url = GURL(url_spec); |  | 
| 94   if (!is_url) { |  | 
| 95     id_ = 0; |  | 
| 96     children.clear(); |  | 
| 97     if (!pickle->ReadInt(iterator, &id_)) |  | 
| 98       return false; |  | 
| 99     int children_count; |  | 
| 100     if (!pickle->ReadInt(iterator, &children_count)) |  | 
| 101       return false; |  | 
| 102     children.resize(children_count); |  | 
| 103     for (std::vector<BookmarkDragData>::iterator i = children.begin(); |  | 
| 104          i != children.end(); ++i) { |  | 
| 105       if (!i->ReadFromPickle(pickle, iterator)) |  | 
| 106         return false; |  | 
| 107     } |  | 
| 108   } |  | 
| 109   is_valid = true; |  | 
| 110   return true; |  | 
| 111 } |  | 
| 112 |  | 
| 113 void BookmarkDragData::AddChildren(BookmarkBarNode* node) { |  | 
| 114   for (int i = 0, max = node->GetChildCount(); i < max; ++i) |  | 
| 115     children.push_back(BookmarkDragData(node->GetChild(i))); |  | 
| 116 } |  | 
| 117 |  | 
| OLD | NEW | 
|---|