summaryrefslogtreecommitdiffstats
path: root/app/os_exchange_data_provider_gtk.cc
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-23 21:42:58 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-23 21:42:58 +0000
commitb6d432335f59500e092de2be4fcf42ed303ae1c5 (patch)
tree0dae24ec6c0f89442ee37d18aeb17f5dcf48d6e0 /app/os_exchange_data_provider_gtk.cc
parent599ea9fd7f5f029661916c191ff89b7358719f81 (diff)
downloadchromium_src-b6d432335f59500e092de2be4fcf42ed303ae1c5.zip
chromium_src-b6d432335f59500e092de2be4fcf42ed303ae1c5.tar.gz
chromium_src-b6d432335f59500e092de2be4fcf42ed303ae1c5.tar.bz2
Implements file contents support in OSExchangeData and DropTarget
for gtk. Makes html and file contents support in OSExchangeData only for windows (as that is the only place we need it), and makes dragging files work. BUG=none TEST=none Review URL: http://codereview.chromium.org/232002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26995 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app/os_exchange_data_provider_gtk.cc')
-rw-r--r--app/os_exchange_data_provider_gtk.cc104
1 files changed, 37 insertions, 67 deletions
diff --git a/app/os_exchange_data_provider_gtk.cc b/app/os_exchange_data_provider_gtk.cc
index 5b32907..597a5ae 100644
--- a/app/os_exchange_data_provider_gtk.cc
+++ b/app/os_exchange_data_provider_gtk.cc
@@ -7,7 +7,9 @@
#include <algorithm>
#include "app/gtk_dnd_util.h"
+#include "base/file_path.h"
#include "base/string_util.h"
+#include "net/base/net_util.h"
OSExchangeDataProviderGtk::OSExchangeDataProviderGtk(
int known_formats,
@@ -53,15 +55,8 @@ GtkTargetList* OSExchangeDataProviderGtk::GetTargetList() const {
OSExchangeData::URL);
}
- if ((formats_ & OSExchangeData::FILE_CONTENTS) != 0)
- NOTIMPLEMENTED();
-
if ((formats_ & OSExchangeData::FILE_NAME) != 0)
- NOTIMPLEMENTED();
-
- if ((formats_ & OSExchangeData::HTML) != 0)
- NOTIMPLEMENTED();
-
+ gtk_target_list_add_uri_targets(targets, OSExchangeData::FILE_NAME);
for (PickleData::const_iterator i = pickle_data_.begin();
i != pickle_data_.end(); ++i) {
@@ -101,15 +96,14 @@ void OSExchangeDataProviderGtk::WriteFormatToSelection(
free(uri_array[0]);
}
- if ((format & OSExchangeData::FILE_CONTENTS) != 0)
- NOTIMPLEMENTED();
-
- if ((format & OSExchangeData::FILE_NAME) != 0)
- NOTIMPLEMENTED();
-
- if ((format & OSExchangeData::HTML) != 0)
- NOTIMPLEMENTED();
-
+ if ((format & OSExchangeData::FILE_NAME) != 0) {
+ gchar* uri_array[2];
+ uri_array[0] =
+ strdup(net::FilePathToFileURL(FilePath(filename_)).spec().c_str());
+ uri_array[1] = NULL;
+ gtk_selection_data_set_uris(selection, uri_array);
+ free(uri_array[0]);
+ }
if ((format & OSExchangeData::PICKLED_DATA) != 0) {
for (PickleData::const_iterator i = pickle_data_.begin();
@@ -138,7 +132,7 @@ void OSExchangeDataProviderGtk::SetURL(const GURL& url,
}
void OSExchangeDataProviderGtk::SetFilename(const std::wstring& full_path) {
- filename_ = WideToUTF16Hack(full_path);
+ filename_ = WideToUTF8(full_path);
formats_ |= OSExchangeData::FILE_NAME;
}
@@ -148,21 +142,6 @@ void OSExchangeDataProviderGtk::SetPickledData(GdkAtom format,
formats_ |= OSExchangeData::PICKLED_DATA;
}
-void OSExchangeDataProviderGtk::SetFileContents(
- const std::wstring& filename,
- const std::string& file_contents) {
- filename_ = WideToUTF16Hack(filename);
- file_contents_ = file_contents;
- formats_ |= OSExchangeData::FILE_CONTENTS;
-}
-
-void OSExchangeDataProviderGtk::SetHtml(const std::wstring& html,
- const GURL& base_url) {
- html_ = WideToUTF16Hack(html);
- base_url_ = base_url;
- formats_ |= OSExchangeData::HTML;
-}
-
bool OSExchangeDataProviderGtk::GetString(std::wstring* data) const {
if ((formats_ & OSExchangeData::STRING) == 0)
return false;
@@ -172,8 +151,11 @@ bool OSExchangeDataProviderGtk::GetString(std::wstring* data) const {
bool OSExchangeDataProviderGtk::GetURLAndTitle(GURL* url,
std::wstring* title) const {
- if ((formats_ & OSExchangeData::URL) == 0)
- return false;
+ if ((formats_ & OSExchangeData::URL) == 0) {
+ title->clear();
+ return GetPlainTextURL(url);
+ }
+
if (!url_.is_valid())
return false;
@@ -185,7 +167,7 @@ bool OSExchangeDataProviderGtk::GetURLAndTitle(GURL* url,
bool OSExchangeDataProviderGtk::GetFilename(std::wstring* full_path) const {
if ((formats_ & OSExchangeData::FILE_NAME) == 0)
return false;
- *full_path = UTF16ToWideHack(filename_);
+ *full_path = UTF8ToWide(filename_);
return true;
}
@@ -199,33 +181,18 @@ bool OSExchangeDataProviderGtk::GetPickledData(GdkAtom format,
return true;
}
-bool OSExchangeDataProviderGtk::GetFileContents(
- std::wstring* filename,
- std::string* file_contents) const {
- if ((formats_ & OSExchangeData::FILE_CONTENTS) == 0)
- return false;
- *filename = UTF16ToWideHack(filename_);
- *file_contents = file_contents_;
- return true;
-}
-
-bool OSExchangeDataProviderGtk::GetHtml(std::wstring* html,
- GURL* base_url) const {
- if ((formats_ & OSExchangeData::HTML) == 0)
- return false;
- *html = UTF16ToWideHack(filename_);
- *base_url = base_url_;
- return true;
-}
-
bool OSExchangeDataProviderGtk::HasString() const {
return (known_formats_ & OSExchangeData::STRING) != 0 ||
(formats_ & OSExchangeData::STRING) != 0;
}
bool OSExchangeDataProviderGtk::HasURL() const {
- return (known_formats_ & OSExchangeData::URL) != 0 ||
- (formats_ & OSExchangeData::URL) != 0;
+ if ((known_formats_ & OSExchangeData::URL) != 0 ||
+ (formats_ & OSExchangeData::URL) != 0) {
+ return true;
+ }
+ // No URL, see if we have plain text that can be parsed as a URL.
+ return GetPlainTextURL(NULL);
}
bool OSExchangeDataProviderGtk::HasFile() const {
@@ -233,21 +200,24 @@ bool OSExchangeDataProviderGtk::HasFile() const {
(formats_ & OSExchangeData::FILE_NAME) != 0;
}
-bool OSExchangeDataProviderGtk::HasFileContents() const {
- return (known_formats_ & OSExchangeData::FILE_CONTENTS) != 0 ||
- (formats_ & OSExchangeData::FILE_CONTENTS) != 0;
-}
-
-bool OSExchangeDataProviderGtk::HasHtml() const {
- return (known_formats_ & OSExchangeData::HTML) != 0 ||
- (formats_ & OSExchangeData::HTML) != 0;
-}
-
bool OSExchangeDataProviderGtk::HasCustomFormat(GdkAtom format) const {
return known_custom_formats_.find(format) != known_custom_formats_.end() ||
pickle_data_.find(format) != pickle_data_.end();
}
+bool OSExchangeDataProviderGtk::GetPlainTextURL(GURL* url) const {
+ if ((formats_ & OSExchangeData::STRING) == 0)
+ return false;
+
+ GURL test_url(string_);
+ if (!test_url.is_valid())
+ return false;
+
+ if (url)
+ *url = test_url;
+ return true;
+}
+
///////////////////////////////////////////////////////////////////////////////
// OSExchangeData, public: