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