1 // Copyright (c) 2012 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 "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
6
7 #include "base/logging.h"
8 #include "base/pickle.h"
9 #include "base/strings/string_util.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "ui/base/clipboard/clipboard.h"
12
13 const char* BrowserActionDragData::kClipboardFormatString =
14 "chromium/x-browser-actions";
15
BrowserActionDragData()16 BrowserActionDragData::BrowserActionDragData()
17 : profile_(NULL), index_(-1) {
18 }
19
BrowserActionDragData(const std::string & id,int index)20 BrowserActionDragData::BrowserActionDragData(
21 const std::string& id, int index)
22 : profile_(NULL), id_(id), index_(index) {
23 }
24
IsFromProfile(Profile * profile) const25 bool BrowserActionDragData::IsFromProfile(Profile* profile) const {
26 return profile_ == profile;
27 }
28
29 #if defined(TOOLKIT_VIEWS)
Write(Profile * profile,ui::OSExchangeData * data) const30 void BrowserActionDragData::Write(
31 Profile* profile, ui::OSExchangeData* data) const {
32 DCHECK(data);
33 Pickle data_pickle;
34 WriteToPickle(profile, &data_pickle);
35 data->SetPickledData(GetBrowserActionCustomFormat(), data_pickle);
36 }
37
Read(const ui::OSExchangeData & data)38 bool BrowserActionDragData::Read(const ui::OSExchangeData& data) {
39 if (!data.HasCustomFormat(GetBrowserActionCustomFormat()))
40 return false;
41
42 Pickle drag_data_pickle;
43 if (!data.GetPickledData(GetBrowserActionCustomFormat(), &drag_data_pickle))
44 return false;
45
46 if (!ReadFromPickle(&drag_data_pickle))
47 return false;
48
49 return true;
50 }
51
52 // static
53 const ui::OSExchangeData::CustomFormat&
GetBrowserActionCustomFormat()54 BrowserActionDragData::GetBrowserActionCustomFormat() {
55 CR_DEFINE_STATIC_LOCAL(
56 ui::OSExchangeData::CustomFormat,
57 format,
58 (ui::Clipboard::GetFormatType(kClipboardFormatString)));
59
60 return format;
61 }
62 #endif
63
WriteToPickle(Profile * profile,Pickle * pickle) const64 void BrowserActionDragData::WriteToPickle(
65 Profile* profile, Pickle* pickle) const {
66 pickle->WriteBytes(&profile, sizeof(profile));
67 pickle->WriteString(id_);
68 pickle->WriteUInt64(index_);
69 }
70
ReadFromPickle(Pickle * pickle)71 bool BrowserActionDragData::ReadFromPickle(Pickle* pickle) {
72 PickleIterator data_iterator(*pickle);
73
74 const char* tmp;
75 if (!pickle->ReadBytes(&data_iterator, &tmp, sizeof(profile_)))
76 return false;
77 memcpy(&profile_, tmp, sizeof(profile_));
78
79 if (!pickle->ReadString(&data_iterator, &id_))
80 return false;
81
82 uint64 index;
83 if (!pickle->ReadUInt64(&data_iterator, &index))
84 return false;
85 index_ = static_cast<size_t>(index);
86
87 return true;
88 }
89