open_with_dialog_controller.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef WIN8_TEST_OPEN_WITH_DIALOG_CONTROLLER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define WIN8_TEST_OPEN_WITH_DIALOG_CONTROLLER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <windows.h>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_forward.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string16.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace win8 {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Asynchronously drives Windows 8's OpenWithDialog into making a given program
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the default handler for an URL protocol.
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OpenWithDialogController {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A callback that is invoked upon completion of the OpenWithDialog
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // interaction. If the HRESULT indicates success, the interaction completed
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // successfully. Otherwise, the vector of strings may contain the list of
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // possible choices if the desired program could not be selected.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(HRESULT,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              std::vector<string16>)> SetDefaultCallback;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OpenWithDialogController();
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~OpenWithDialogController();
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Starts the process of making |program| the default handler for
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |url_protocol|. |parent_window| may be NULL.  |callback| will be invoked
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // upon completion. This instance may be deleted prior to |callback| being
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // invoked to cancel the operation.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Begin(HWND parent_window,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const string16& url_protocol,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const string16& program,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const SetDefaultCallback& callback);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sychronously drives the dialog by running a message loop. Do not by any
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // means call this on a thread that already has a message loop. Returns S_OK
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on success. Otherwise, |choices| may contain the list of possible choices
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the desired program could not be selected.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HRESULT RunSynchronously(HWND parent_window,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const string16& url_protocol,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const string16& program,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           std::vector<string16>* choices);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Context;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtr<Context> context_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OpenWithDialogController);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace win8
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // WIN8_TEST_OPEN_WITH_DIALOG_CONTROLLER_H_
62