15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/nix/mime_util_xdg.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/nix/xdg_util.h" 13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/launch.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/select_file_dialog_impl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ui_strings.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These conflict with base/tracked_objects.h, so need to come last. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gdk/gdkx.h> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetTitle(const std::string& title, int message_id) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title.empty() ? l10n_util::GetStringUTF8(message_id) : title; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKdialogBinary[] = "kdialog"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace libgtk2ui { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation of SelectFileDialog that shows a KDE common dialog for 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// choosing a file or folder. This acts as a modal dialog. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SelectFileDialogImplKDE : public SelectFileDialogImpl { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectFileDialogImplKDE(Listener* listener, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFilePolicy* policy, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::nix::DesktopEnvironment desktop); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SelectFileDialogImplKDE(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SelectFileDialog implementation. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |params| is user data we pass back via the Listener interface. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SelectFileImpl( 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Type type, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& title, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileTypeInfo* file_types, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int file_type_index, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& default_extension, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow owning_window, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* params) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasMultipleFileTypeChoicesImpl() OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct KDialogParams { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KDialogParams(const std::string& type, const std::string& title, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, gfx::NativeWindow parent, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool file_operation, bool multiple_selection, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* kdialog_params, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (SelectFileDialogImplKDE::*callback)(const std::string&, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, void*)) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(type), title(title), default_path(default_path), parent(parent), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_operation(file_operation), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) multiple_selection(multiple_selection), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kdialog_params(kdialog_params), callback(callback) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string type; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string title; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath default_path; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool file_operation; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multiple_selection; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* kdialog_params; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (SelectFileDialogImplKDE::*callback)(const std::string&, int, void*); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the filters from |file_types_| and concatenate them into 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |filter_string|. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetMimeTypeFilterString(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get KDialog command line representing the Argv array for KDialog. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetKDialogCommandLine(const std::string& type, const std::string& title, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, gfx::NativeWindow parent, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool file_operation, bool multiple_selection, CommandLine* command_line); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call KDialog on the FILE thread and post results back to the UI thread. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallKDialogOutput(const KDialogParams& params); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the listener that a single file was chosen. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FileSelected(const base::FilePath& path, void* params); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the listener that multiple files were chosen. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MultiFilesSelected(const std::vector<base::FilePath>& files, 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* params); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the listener that no file was chosen (the action was canceled). 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dialog is passed so we can find that |params| pointer that was passed to 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // us when we were told to show the dialog. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FileNotSelected(void *params); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CreateSelectFolderDialog(Type type, 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& title, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void* params); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateFileOpenDialog(const std::string& title, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void* params); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateMultiFileOpenDialog(const std::string& title, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void* params); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateSaveAsDialog(const std::string& title, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void* params); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Common function for OnSelectSingleFileDialogResponse and 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnSelectSingleFolderDialogResponse. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SelectSingleFileHelper(const std::string& output, int exit_code, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* params, bool allow_folder); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSelectSingleFileDialogResponse(const std::string& output, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_code, void* params); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSelectMultiFileDialogResponse(const std::string& output, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_code, void* params); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSelectSingleFolderDialogResponse(const std::string& output, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_code, void* params); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be either DESKTOP_ENVIRONMENT_KDE3 or DESKTOP_ENVIRONMENT_KDE4. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::nix::DesktopEnvironment desktop_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImplKDE); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SelectFileDialogImpl::CheckKDEDialogWorksOnUIThread() { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No choice. UI thread can't continue without an answer here. Fortunately we 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only do this once, the first time a file dialog is displayed. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_io; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::StringVector cmd_vector; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd_vector.push_back(kKdialogBinary); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd_vector.push_back("--version"); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine command_line(cmd_vector); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string dummy; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::GetAppOutput(command_line, &dummy); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SelectFileDialogImpl* SelectFileDialogImpl::NewSelectFileDialogImplKDE( 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Listener* listener, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFilePolicy* policy, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::nix::DesktopEnvironment desktop) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new SelectFileDialogImplKDE(listener, policy, desktop); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SelectFileDialogImplKDE::SelectFileDialogImplKDE( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Listener* listener, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFilePolicy* policy, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::nix::DesktopEnvironment desktop) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : SelectFileDialogImpl(listener, policy), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_(desktop) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE3 || 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE4); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SelectFileDialogImplKDE::~SelectFileDialogImplKDE() { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We ignore |default_extension|. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::SelectFileImpl( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_path, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileTypeInfo* file_types, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int file_type_index, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& default_extension, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow owning_window, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* params) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = type; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |owning_window| can be null when user right-clicks on a downloadable item 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and chooses 'Open Link in New Tab' when 'Ask where to save each file 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before downloading.' preference is turned on. (http://crbug.com/29213) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (owning_window) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parents_.insert(owning_window); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string title_string = UTF16ToUTF8(title); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_type_index_ = file_type_index; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_types) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_types_ = *file_types; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_types_.include_all_files = true; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_FOLDER: 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case SELECT_UPLOAD_FOLDER: 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateSelectFolderDialog(type, title_string, default_path, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owning_window, params); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_OPEN_FILE: 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFileOpenDialog(title_string, default_path, owning_window, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_OPEN_MULTI_FILE: 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateMultiFileOpenDialog(title_string, default_path, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owning_window, params); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_SAVEAS_FILE: 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSaveAsDialog(title_string, default_path, owning_window, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SelectFileDialogImplKDE::HasMultipleFileTypeChoicesImpl() { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_types_.extensions.size() > 1; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SelectFileDialogImplKDE::GetMimeTypeFilterString() { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string filter_string; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need a filter set because the same mime type can appear multiple times. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> filter_set; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < file_types_.extensions.size(); ++i) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; j < file_types_.extensions[i].size(); ++j) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_types_.extensions[i][j].empty()) { 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string mime_type = base::nix::GetFileMimeType(base::FilePath( 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "name").ReplaceExtension(file_types_.extensions[i][j])); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter_set.insert(mime_type); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the *.* filter, but only if we have added other filters (otherwise it 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is implied). 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_types_.include_all_files && !file_types_.extensions.empty()) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter_set.insert("application/octet-stream"); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the final output string. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter_string.clear(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::iterator it = filter_set.begin(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != filter_set.end(); ++it) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter_string.append(*it + " "); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return filter_string; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::CallKDialogOutput(const KDialogParams& params) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::StringVector cmd_vector; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd_vector.push_back(kKdialogBinary); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine command_line(cmd_vector); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetKDialogCommandLine(params.type, params.title, params.default_path, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.parent, params.file_operation, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.multiple_selection, &command_line); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string output; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_code; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get output from KDialog 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetAppOutputWithExitCode(command_line, &output, &exit_code); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!output.empty()) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output.erase(output.size() - 1); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now the dialog is no longer showing. We can erase its parent from the 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parent set. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erg): FIX THIS. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // std::set<GtkWindow*>::iterator iter = parents_.find(params.parent); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if (iter != parents_.end()) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parents_.erase(iter); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(params.callback, this, output, exit_code, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.kdialog_params)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::GetKDialogCommandLine(const std::string& type, 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& title, const base::FilePath& path, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, bool file_operation, bool multiple_selection, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(command_line); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attach to the current Chrome window. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET((parent))); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_id = GDK_DRAWABLE_XID(gdk_window); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchNative( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_ == base::nix::DESKTOP_ENVIRONMENT_KDE3 ? "--embed" : "--attach", 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(window_id)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the correct title for the dialog. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchNative("--title", title); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable multiple file selection if we need to. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multiple_selection) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch("--multiple"); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch("--separate-output"); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(type); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The path should never be empty. If it is, set it to PWD. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (path.empty()) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendArgPath(base::FilePath(".")); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendArgPath(path); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Depending on the type of the operation we need, get the path to the 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file/folder and set up mime type filters. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_operation) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendArg(GetMimeTypeFilterString()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "KDialog command line: " << command_line->GetCommandLineString(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SelectFileDialogImplKDE::FileSelected(const base::FilePath& path, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* params) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ == SELECT_SAVEAS_FILE) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *last_saved_path_ = path.DirName(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (type_ == SELECT_OPEN_FILE) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *last_opened_path_ = path.DirName(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (type_ == SELECT_FOLDER) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *last_opened_path_ = path; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener_) { // What does the filter index actually do? 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dfilimon): Get a reasonable index value from somewhere. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->FileSelected(path, 1, params); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::MultiFilesSelected( 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& files, void* params) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *last_opened_path_ = files[0].DirName(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener_) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->MultiFilesSelected(files, params); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::FileNotSelected(void* params) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener_) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->FileSelectionCanceled(params); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::CreateSelectFolderDialog( 356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Type type, const std::string& title, const base::FilePath& default_path, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void *params) { 358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int title_message_id = (type == SELECT_UPLOAD_FOLDER) 359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ? IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : IDS_SELECT_FOLDER_DIALOG_TITLE; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::CallKDialogOutput, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KDialogParams( 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--getexistingdirectory", 368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetTitle(title, title_message_id), 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_path.empty() ? *last_opened_path_ : default_path, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent, false, false, params, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse))); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::CreateFileOpenDialog( 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& title, const base::FilePath& default_path, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void* params) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::CallKDialogOutput, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KDialogParams( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--getopenfilename", 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTitle(title, IDS_OPEN_FILE_DIALOG_TITLE), 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_path.empty() ? *last_opened_path_ : default_path, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent, true, false, params, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse))); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::CreateMultiFileOpenDialog( 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& title, const base::FilePath& default_path, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void* params) { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::CallKDialogOutput, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KDialogParams( 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--getopenfilename", 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTitle(title, IDS_OPEN_FILES_DIALOG_TITLE), 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_path.empty() ? *last_opened_path_ : default_path, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent, true, true, params, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse))); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::CreateSaveAsDialog( 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& title, const base::FilePath& default_path, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, void* params) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::CallKDialogOutput, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KDialogParams( 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--getsavefilename", 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTitle(title, IDS_SAVE_AS_DIALOG_TITLE), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_path.empty() ? *last_saved_path_ : default_path, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent, true, false, params, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse))); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::SelectSingleFileHelper(const std::string& output, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exit_code, void* params, bool allow_folder) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "[kdialog] SingleFileResponse: " << output; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exit_code != 0 || output.empty()) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileNotSelected(params); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path(output); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (allow_folder) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelected(path, params); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CallDirectoryExistsOnUIThread(path)) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileNotSelected(params); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelected(path, params); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse( 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& output, int exit_code, void* params) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectSingleFileHelper(output, exit_code, params, false); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& output, int exit_code, void* params) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectSingleFileHelper(output, exit_code, params, true); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& output, int exit_code, void* params) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "[kdialog] MultiFileResponse: " << output; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exit_code != 0 || output.empty()) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileNotSelected(params); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> filenames; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tokenize(output, "\n", &filenames); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath> filenames_fp; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::iterator iter = filenames.begin(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != filenames.end(); ++iter) { 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path(*iter); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CallDirectoryExistsOnUIThread(path)) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filenames_fp.push_back(path); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filenames_fp.empty()) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileNotSelected(params); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultiFilesSelected(filenames_fp, params); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace libgtk2ui 483