12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_METRO_DRIVER_FILE_PICKER_ASH_H_
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_UI_METRO_DRIVER_FILE_PICKER_ASH_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/files/file_path.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChromeAppViewAsh;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct MetroViewerHostMsg_SaveAsDialogParams;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Base class for the file pickers.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePickerSessionBase {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a file picker for open_file_name.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FilePickerSessionBase(ChromeAppViewAsh* app_view,
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const base::string16& title,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const base::string16& filter,
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 const base::FilePath& default_path);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FilePickerSessionBase() {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Runs the picker, returns true on success.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Run();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16& result() const {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result_;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool success() const {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return success_;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates, configures and starts a file picker.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the HRESULT returned is a failure code the file picker has not started,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so no callbacks should be expected.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual HRESULT StartFilePicker() = 0;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True iff a file picker has successfully finished.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool success_;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The title of the file picker.
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 title_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The file type filter.
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 filter_;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The starting directory/file name.
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath default_path_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pointer to the ChromeAppViewAsh instance. We notify the ChromeAppViewAsh
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // instance when the file open/save operations complete.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChromeAppViewAsh* app_view_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 result_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initiate a file picker, must be called on the main metro thread.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true on success.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DoFilePicker();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FilePickerSessionBase);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Provides functionality to display the open file/multiple open file pickers
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// metro dialog.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OpenFilePickerSession : public FilePickerSessionBase {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit OpenFilePickerSession(ChromeAppViewAsh* app_view,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const base::string16& title,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const base::string16& filter,
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 const base::FilePath& default_path,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 bool allow_multi_select);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<base::FilePath>& filenames() const {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return filenames_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool allow_multi_select() const {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return allow_multi_select_;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual HRESULT StartFilePicker() OVERRIDE;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef winfoundtn::IAsyncOperation<winstorage::StorageFile*>
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SingleFileAsyncOp;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef winfoundtn::Collections::IVectorView<
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      winstorage::StorageFile*> StorageFileVectorCollection;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef winfoundtn::IAsyncOperation<StorageFileVectorCollection*>
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MultiFileAsyncOp;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called asynchronously when a single file picker is done.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HRESULT SinglePickerDone(SingleFileAsyncOp* async, AsyncStatus status);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called asynchronously when a multi file picker is done.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HRESULT MultiPickerDone(MultiFileAsyncOp* async, AsyncStatus status);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Composes a multi-file result string suitable for returning to a
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from a storage file collection.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static HRESULT ComposeMultiFileResult(StorageFileVectorCollection* files,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        base::string16* result);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if the multi file picker is to be displayed.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool allow_multi_select_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If multi select is true then this member contains the list of filenames
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to be returned back.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath> filenames_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OpenFilePickerSession);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Provides functionality to display the save file picker.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SaveFilePickerSession : public FilePickerSessionBase {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SaveFilePickerSession(
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ChromeAppViewAsh* app_view,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const MetroViewerHostMsg_SaveAsDialogParams& params);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int SaveFilePickerSession::filter_index() const;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual HRESULT StartFilePicker() OVERRIDE;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef winfoundtn::IAsyncOperation<winstorage::StorageFile*>
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SaveFileAsyncOp;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called asynchronously when the save file picker is done.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HRESULT FilePickerDone(SaveFileAsyncOp* async, AsyncStatus status);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int filter_index_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SaveFilePickerSession);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Provides functionality to display the folder picker.
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FolderPickerSession : public FilePickerSessionBase {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit FolderPickerSession(ChromeAppViewAsh* app_view,
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const base::string16& title);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual HRESULT StartFilePicker() OVERRIDE;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef winfoundtn::IAsyncOperation<winstorage::StorageFolder*>
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FolderPickerAsyncOp;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called asynchronously when the folder picker is done.
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HRESULT FolderPickerDone(FolderPickerAsyncOp* async, AsyncStatus status);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FolderPickerSession);
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_METRO_DRIVER_FILE_PICKER_ASH_H_
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
168