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