| // 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/dev/printing_dev.h" |
| |
| #include "ppapi/c/dev/ppb_printing_dev.h" |
| #include "ppapi/cpp/instance.h" |
| #include "ppapi/cpp/instance_handle.h" |
| #include "ppapi/cpp/module.h" |
| #include "ppapi/cpp/module_impl.h" |
| |
| namespace pp { |
| |
| namespace { |
| |
| static const char kPPPPrintingInterface[] = PPP_PRINTING_DEV_INTERFACE; |
| |
| template <> const char* interface_name<PPB_Printing_Dev_0_7>() { |
| return PPB_PRINTING_DEV_INTERFACE_0_7; |
| } |
| |
| uint32_t QuerySupportedFormats(PP_Instance instance) { |
| void* object = |
| Instance::GetPerInstanceObject(instance, kPPPPrintingInterface); |
| if (!object) |
| return 0; |
| return static_cast<Printing_Dev*>(object)->QuerySupportedPrintOutputFormats(); |
| } |
| |
| int32_t Begin(PP_Instance instance, |
| const struct PP_PrintSettings_Dev* print_settings) { |
| void* object = |
| Instance::GetPerInstanceObject(instance, kPPPPrintingInterface); |
| if (!object) |
| return 0; |
| return static_cast<Printing_Dev*>(object)->PrintBegin(*print_settings); |
| } |
| |
| PP_Resource PrintPages(PP_Instance instance, |
| const struct PP_PrintPageNumberRange_Dev* page_ranges, |
| uint32_t page_range_count) { |
| void* object = |
| pp::Instance::GetPerInstanceObject(instance, kPPPPrintingInterface); |
| if (!object) |
| return 0; |
| return static_cast<Printing_Dev*>(object)->PrintPages( |
| page_ranges, page_range_count).detach(); |
| } |
| |
| void End(PP_Instance instance) { |
| void* object = |
| pp::Instance::GetPerInstanceObject(instance, kPPPPrintingInterface); |
| if (object) |
| static_cast<Printing_Dev*>(object)->PrintEnd(); |
| } |
| |
| PP_Bool IsScalingDisabled(PP_Instance instance) { |
| void* object = |
| pp::Instance::GetPerInstanceObject(instance, kPPPPrintingInterface); |
| if (!object) |
| return PP_FALSE; |
| bool return_value = |
| static_cast<Printing_Dev*>(object)->IsPrintScalingDisabled(); |
| return PP_FromBool(return_value); |
| } |
| |
| const PPP_Printing_Dev ppp_printing = { |
| &QuerySupportedFormats, |
| &Begin, |
| &PrintPages, |
| &End, |
| &IsScalingDisabled |
| }; |
| |
| } // namespace |
| |
| Printing_Dev::Printing_Dev(Instance* instance) |
| : associated_instance_(instance) { |
| Module::Get()->AddPluginInterface(kPPPPrintingInterface, &ppp_printing); |
| instance->AddPerInstanceObject( |
| kPPPPrintingInterface, this); |
| if (has_interface<PPB_Printing_Dev_0_7>()) { |
| PassRefFromConstructor(get_interface<PPB_Printing_Dev_0_7>()->Create( |
| associated_instance_.pp_instance())); |
| } |
| } |
| |
| Printing_Dev::~Printing_Dev() { |
| Instance::RemovePerInstanceObject(associated_instance_, |
| kPPPPrintingInterface, this); |
| } |
| |
| // static |
| bool Printing_Dev::IsAvailable() { |
| return has_interface<PPB_Printing_Dev_0_7>(); |
| } |
| |
| int32_t Printing_Dev::GetDefaultPrintSettings( |
| const CompletionCallbackWithOutput<PP_PrintSettings_Dev>& callback) const { |
| if (has_interface<PPB_Printing_Dev_0_7>()) { |
| return get_interface<PPB_Printing_Dev_0_7>()->GetDefaultPrintSettings( |
| pp_resource(), callback.output(), callback.pp_completion_callback()); |
| } |
| return callback.MayForce(PP_ERROR_NOINTERFACE); |
| } |
| |
| } // namespace pp |