summaryrefslogtreecommitdiffstats
path: root/src/core/extensions/file_system_delegate_qt.h
blob: 1e9d87c38fa4db0dbf6bf71bed254499af4b525d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#ifndef FILE_SYSTEM_DELEGATE_QT_H
#define FILE_SYSTEM_DELEGATE_QT_H

#include "extensions/browser/api/file_system/file_system_delegate.h"

#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/ref_counted.h"
#include "extensions/browser/extension_function.h"
#include "ui/shell_dialogs/select_file_dialog.h"

#include <memory>
#include <vector>

namespace content {
class BrowserContext;
}  // namespace content

namespace extensions {

class FileEntryPickerQt : public ui::SelectFileDialog::Listener {
public:
    FileEntryPickerQt(
        content::WebContents *web_contents,
        const base::FilePath &suggested_name,
        const ui::SelectFileDialog::FileTypeInfo *file_type_info,
        ui::SelectFileDialog::Type picker_type,
        FileSystemDelegate::FilesSelectedCallback files_selected_callback,
        base::OnceClosure file_selection_canceled_callback);

    FileEntryPickerQt(const FileEntryPickerQt &) = delete;
    FileEntryPickerQt &operator=(const FileEntryPickerQt &) = delete;

private:
    ~FileEntryPickerQt() override;

    // ui::SelectFileDialog::Listener implementation.
    void FileSelected(const base::FilePath &path,
        int index,
        void *params) override;
    void FileSelectedWithExtraInfo(const ui::SelectedFileInfo &file,
        int index,
        void *params) override;
    void MultiFilesSelected(const std::vector<base::FilePath> &files,
                          void *params) override;
    void MultiFilesSelectedWithExtraInfo(
        const std::vector<ui::SelectedFileInfo> &files,
        void *params) override;
    void FileSelectionCanceled(void *params) override;

    FileSystemDelegate::FilesSelectedCallback m_filesSelectedCallback;
    base::OnceClosure m_fileSelectionCanceledCallback;
    scoped_refptr<ui::SelectFileDialog> m_selectFileDialog;
};

class FileSystemDelegateQt : public FileSystemDelegate
{
public:
    FileSystemDelegateQt();

    // FileSystemDelegate implementation
    virtual base::FilePath GetDefaultDirectory() override;
    virtual base::FilePath GetManagedSaveAsDirectory(
        content::BrowserContext *browser_context,
        const Extension &extension) override;
    virtual bool ShowSelectFileDialog(
        scoped_refptr<ExtensionFunction> extension_function,
        ui::SelectFileDialog::Type type,
        const base::FilePath &default_path,
        const ui::SelectFileDialog::FileTypeInfo *file_types,
        FileSystemDelegate::FilesSelectedCallback files_selected_callback,
        base::OnceClosure file_selection_canceled_callback) override;
    virtual void ConfirmSensitiveDirectoryAccess(
        bool has_write_permission,
        const std::u16string &app_name,
        content::WebContents *web_contents,
        base::OnceClosure on_accept,
        base::OnceClosure on_cancel) override;
    virtual int GetDescriptionIdForAcceptType(const std::string &accept_type) override;
    virtual SavedFilesServiceInterface *GetSavedFilesService(
        content::BrowserContext *browser_context) override;
};

} // namespace extensions

#endif // FILE_SYSTEM_DELEGATE_QT_H