172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/pickle.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* BrowserActionDragData::kClipboardFormatString =
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "chromium/x-browser-actions";
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserActionDragData::BrowserActionDragData()
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : profile_id_(0), index_(-1) {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserActionDragData::BrowserActionDragData(
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& id, int index)
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : profile_id_(0), id_(id), index_(index) {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionDragData::IsFromProfile(Profile* profile) const {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return (profile_id_ == profile->GetRuntimeId());
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserActionDragData::Write(
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Profile* profile, ui::OSExchangeData* data) const {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(data);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Pickle data_pickle;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteToPickle(profile, &data_pickle);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data->SetPickledData(GetBrowserActionCustomFormat(), data_pickle);
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool BrowserActionDragData::Read(const ui::OSExchangeData& data) {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!data.HasCustomFormat(GetBrowserActionCustomFormat()))
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Pickle drag_data_pickle;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!data.GetPickledData(GetBrowserActionCustomFormat(), &drag_data_pickle))
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!ReadFromPickle(&drag_data_pickle))
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenui::OSExchangeData::CustomFormat
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    BrowserActionDragData::GetBrowserActionCustomFormat() {
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static ui::OSExchangeData::CustomFormat format;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool format_valid = false;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!format_valid) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    format_valid = true;
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    format = ui::OSExchangeData::RegisterCustomFormat(
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        BrowserActionDragData::kClipboardFormatString);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return format;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserActionDragData::WriteToPickle(
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile, Pickle* pickle) const {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ProfileId profile_id = profile->GetRuntimeId();
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteBytes(&profile_id, sizeof(profile_id));
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteString(id_);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteSize(index_);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionDragData::ReadFromPickle(Pickle* pickle) {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void* data_iterator = NULL;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* tmp;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!pickle->ReadBytes(&data_iterator, &tmp, sizeof(profile_id_)))
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  memcpy(&profile_id_, tmp, sizeof(profile_id_));
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!pickle->ReadString(&data_iterator, &id_))
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!pickle->ReadSize(&data_iterator, &index_))
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
90