// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

#ifndef CEF_LIBCEF_COMMON_DRAG_DATA_IMPL_H_
#define CEF_LIBCEF_COMMON_DRAG_DATA_IMPL_H_
#pragma once

#include "include/cef_drag_data.h"
#include "include/cef_image.h"

#include <vector>

#include "base/synchronization/lock.h"
#include "content/public/common/drop_data.h"

// Implementation of CefDragData.
class CefDragDataImpl : public CefDragData {
 public:
  CefDragDataImpl();
  explicit CefDragDataImpl(const content::DropData& data);
  CefDragDataImpl(const content::DropData& data,
                  CefRefPtr<CefImage> image,
                  const CefPoint& image_hotspot);

  CefRefPtr<CefDragData> Clone() override;
  bool IsReadOnly() override;
  bool IsLink() override;
  bool IsFragment() override;
  bool IsFile() override;
  CefString GetLinkURL() override;
  CefString GetLinkTitle() override;
  CefString GetLinkMetadata() override;
  CefString GetFragmentText() override;
  CefString GetFragmentHtml() override;
  CefString GetFragmentBaseURL() override;
  CefString GetFileName() override;
  size_t GetFileContents(CefRefPtr<CefStreamWriter> writer) override;
  bool GetFileNames(std::vector<CefString>& names) override;
  void SetLinkURL(const CefString& url) override;
  void SetLinkTitle(const CefString& title) override;
  void SetLinkMetadata(const CefString& data) override;
  void SetFragmentText(const CefString& text) override;
  void SetFragmentHtml(const CefString& fragment) override;
  void SetFragmentBaseURL(const CefString& fragment) override;
  void ResetFileContents() override;
  void AddFile(const CefString& path, const CefString& display_name) override;
  CefRefPtr<CefImage> GetImage() override;
  CefPoint GetImageHotspot() override;
  bool HasImage() override;

  // This method is not safe. Use Lock/Unlock to get mutually exclusive access.
  content::DropData* drop_data() { return &data_; }

  void SetReadOnly(bool read_only);

  base::Lock& lock() { return lock_; }

 private:
  content::DropData data_;
  CefRefPtr<CefImage> image_;
  CefPoint image_hotspot_;

  // True if this object is read-only.
  bool read_only_;

  base::Lock lock_;

  IMPLEMENT_REFCOUNTING(CefDragDataImpl);
};

#endif  // CEF_LIBCEF_COMMON_DRAG_DATA_IMPL_H_
