// Copyright (c) 2014 The Chromium Embedded Framework 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 "print_handler.h" #include "jni_util.h" #include "util.h" namespace { // JNI CefPrintDialogCallback object. class ScopedJNIPrintDialogCallback : public ScopedJNIObject { public: ScopedJNIPrintDialogCallback(JNIEnv* env, CefRefPtr obj) : ScopedJNIObject( env, obj, "org/cef/callback/CefPrintDialogCallback_N", "CefPrintDialogCallback") {} }; // JNI CefPrintJobCallback object. class ScopedJNIPrintJobCallback : public ScopedJNIObject { public: ScopedJNIPrintJobCallback(JNIEnv* env, CefRefPtr obj) : ScopedJNIObject( env, obj, "org/cef/callback/CefPrintJobCallback_N", "CefPrintJobCallback") {} }; } // namespace PrintHandler::PrintHandler(JNIEnv* env, jobject handler) : handle_(env, handler) {} void PrintHandler::OnPrintStart(CefRefPtr browser) { ScopedJNIEnv env; if (!env) return; ScopedJNIBrowser jbrowser(env, browser); JNI_CALL_VOID_METHOD(env, handle_, "onPrintStart", "(Lorg/cef/browser/CefBrowser;)V", jbrowser.get()); } void PrintHandler::OnPrintSettings(CefRefPtr browser, CefRefPtr settings, bool get_defaults) { ScopedJNIEnv env; if (!env) return; ScopedJNIBrowser jbrowser(env, browser); ScopedJNIPrintSettings jsettings(env, settings); jsettings.SetTemporary(); JNI_CALL_VOID_METHOD( env, handle_, "onPrintSettings", "(Lorg/cef/browser/CefBrowser;Lorg/cef/misc/CefPrintSettings;Z)V", jbrowser.get(), jsettings.get(), get_defaults ? JNI_TRUE : JNI_FALSE); } bool PrintHandler::OnPrintDialog(CefRefPtr browser, bool has_selection, CefRefPtr callback) { ScopedJNIEnv env; if (!env) return false; ScopedJNIBrowser jbrowser(env, browser); ScopedJNIPrintDialogCallback jcallback(env, callback); jboolean jresult = JNI_FALSE; JNI_CALL_METHOD(env, handle_, "onPrintDialog", "(Lorg/cef/browser/CefBrowser;ZLorg/cef/callback/" "CefPrintDialogCallback;)Z", Boolean, jresult, jbrowser.get(), (has_selection ? JNI_TRUE : JNI_FALSE), jcallback.get()); if (jresult == JNI_FALSE) { // If the Java method returns "false" the callback won't be used and // the reference can therefore be removed. jcallback.SetTemporary(); } return (jresult != JNI_FALSE); } bool PrintHandler::OnPrintJob(CefRefPtr browser, const CefString& document_name, const CefString& pdf_file_path, CefRefPtr callback) { ScopedJNIEnv env; if (!env) return false; ScopedJNIBrowser jbrowser(env, browser); ScopedJNIString jdocumentName(env, document_name); ScopedJNIString jpdfFilePath(env, pdf_file_path); ScopedJNIPrintJobCallback jcallback(env, callback); jboolean jresult = JNI_FALSE; JNI_CALL_METHOD( env, handle_, "onPrintJob", "(Lorg/cef/browser/CefBrowser;Ljava/lang/String;Ljava/lang/String;" "Lorg/cef/callback/CefPrintJobCallback;)Z", Boolean, jresult, jbrowser.get(), jdocumentName.get(), jpdfFilePath.get(), jcallback.get()); if (jresult == JNI_FALSE) { // If the Java method returns "false" the callback won't be used and // the reference can therefore be removed. jcallback.SetTemporary(); } return (jresult != JNI_FALSE); } void PrintHandler::OnPrintReset(CefRefPtr browser) { ScopedJNIEnv env; if (!env) return; ScopedJNIBrowser jbrowser(env, browser); JNI_CALL_VOID_METHOD(env, handle_, "onPrintReset", "(Lorg/cef/browser/CefBrowser;)V", jbrowser.get()); } CefSize PrintHandler::GetPdfPaperSize(CefRefPtr browser, int device_units_per_inch) { ScopedJNIEnv env; if (!env) return CefSize(0, 0); ScopedJNIBrowser jbrowser(env, browser); ScopedJNIObjectResult jresult(env); JNI_CALL_METHOD(env, handle_, "getPdfPaperSize", "(Lorg/cef/browser/CefBrowser;I)Ljava/awt/Dimension;", Object, jresult, jbrowser.get(), (jint)device_units_per_inch); if (!jresult) return CefSize(0, 0); return GetJNISize(env, jresult); }