// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ppapi/cpp/trusted/file_chooser_trusted.h"

#include "ppapi/c/pp_bool.h"
#include "ppapi/cpp/completion_callback.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/cpp/module_impl.h"
#include "ppapi/cpp/var.h"
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"

namespace pp {

namespace {

template <> const char* interface_name<PPB_FileChooserTrusted_0_5>() {
  return PPB_FILECHOOSER_TRUSTED_INTERFACE_0_5;
}

template <> const char* interface_name<PPB_FileChooserTrusted_0_6>() {
  return PPB_FILECHOOSER_TRUSTED_INTERFACE_0_6;
}

}  // namespace

FileChooser_Trusted::FileChooser_Trusted() : save_as_(false) {
}

FileChooser_Trusted::FileChooser_Trusted(const InstanceHandle& instance,
                                         PP_FileChooserMode_Dev mode,
                                         const Var& accept_types,
                                         bool save_as,
                                         const std::string& suggested_file_name)
    : FileChooser_Dev(instance, mode, accept_types),
      save_as_(save_as),
      suggested_file_name_(suggested_file_name) {
}

FileChooser_Trusted::FileChooser_Trusted(const FileChooser_Trusted& other)
    : FileChooser_Dev(other),
      save_as_(other.save_as_),
      suggested_file_name_(other.suggested_file_name_) {
}

FileChooser_Trusted& FileChooser_Trusted::operator=(
    const FileChooser_Trusted& other) {
  FileChooser_Dev::operator=(other);
  save_as_ = other.save_as_;
  suggested_file_name_ = other.suggested_file_name_;
  return *this;
}

int32_t FileChooser_Trusted::Show(
    const CompletionCallbackWithOutput< std::vector<FileRef> >& callback) {
  if (has_interface<PPB_FileChooserTrusted_0_6>()) {
    return get_interface<PPB_FileChooserTrusted_0_6>()->ShowWithoutUserGesture(
        pp_resource(),
        PP_FromBool(save_as_),
        Var(suggested_file_name_).pp_var(),
        callback.output(),
        callback.pp_completion_callback());
  }
  if (has_interface<PPB_FileChooserTrusted_0_5>()) {
    // Data for our callback. The callback handler will delete it.
    ChooseCallbackData0_5* data = new ChooseCallbackData0_5;
    data->file_chooser = pp_resource();
    data->output = callback.output();
    data->original_callback = callback.pp_completion_callback();

    return get_interface<PPB_FileChooserTrusted_0_5>()->ShowWithoutUserGesture(
        pp_resource(),
        PP_FromBool(save_as_),
        Var(suggested_file_name_).pp_var(),
        PP_MakeCompletionCallback(&CallbackConverter, data));
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

}  // namespace pp
