1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/cpp/trusted/file_chooser_trusted.h"
6
7#include "ppapi/c/pp_bool.h"
8#include "ppapi/cpp/completion_callback.h"
9#include "ppapi/c/pp_errors.h"
10#include "ppapi/cpp/module_impl.h"
11#include "ppapi/cpp/var.h"
12#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
13
14namespace pp {
15
16namespace {
17
18template <> const char* interface_name<PPB_FileChooserTrusted_0_5>() {
19  return PPB_FILECHOOSER_TRUSTED_INTERFACE_0_5;
20}
21
22template <> const char* interface_name<PPB_FileChooserTrusted_0_6>() {
23  return PPB_FILECHOOSER_TRUSTED_INTERFACE_0_6;
24}
25
26}  // namespace
27
28FileChooser_Trusted::FileChooser_Trusted() : save_as_(false) {
29}
30
31FileChooser_Trusted::FileChooser_Trusted(const InstanceHandle& instance,
32                                         PP_FileChooserMode_Dev mode,
33                                         const Var& accept_types,
34                                         bool save_as,
35                                         const std::string& suggested_file_name)
36    : FileChooser_Dev(instance, mode, accept_types),
37      save_as_(save_as),
38      suggested_file_name_(suggested_file_name) {
39}
40
41FileChooser_Trusted::FileChooser_Trusted(const FileChooser_Trusted& other)
42    : FileChooser_Dev(other),
43      save_as_(other.save_as_),
44      suggested_file_name_(other.suggested_file_name_) {
45}
46
47FileChooser_Trusted& FileChooser_Trusted::operator=(
48    const FileChooser_Trusted& other) {
49  FileChooser_Dev::operator=(other);
50  save_as_ = other.save_as_;
51  suggested_file_name_ = other.suggested_file_name_;
52  return *this;
53}
54
55int32_t FileChooser_Trusted::Show(
56    const CompletionCallbackWithOutput< std::vector<FileRef> >& callback) {
57  if (has_interface<PPB_FileChooserTrusted_0_6>()) {
58    return get_interface<PPB_FileChooserTrusted_0_6>()->ShowWithoutUserGesture(
59        pp_resource(),
60        PP_FromBool(save_as_),
61        Var(suggested_file_name_).pp_var(),
62        callback.output(),
63        callback.pp_completion_callback());
64  }
65  if (has_interface<PPB_FileChooserTrusted_0_5>()) {
66    // Data for our callback. The callback handler will delete it.
67    ChooseCallbackData0_5* data = new ChooseCallbackData0_5;
68    data->file_chooser = pp_resource();
69    data->output = callback.output();
70    data->original_callback = callback.pp_completion_callback();
71
72    return get_interface<PPB_FileChooserTrusted_0_5>()->ShowWithoutUserGesture(
73        pp_resource(),
74        PP_FromBool(save_as_),
75        Var(suggested_file_name_).pp_var(),
76        PP_MakeCompletionCallback(&CallbackConverter, data));
77  }
78  return callback.MayForce(PP_ERROR_NOINTERFACE);
79}
80
81}  // namespace pp
82