| // 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. |
| |
| #ifndef CHROME_BROWSER_UI_METRO_DRIVER_PRINT_HANDLER_H_ |
| #define CHROME_BROWSER_UI_METRO_DRIVER_PRINT_HANDLER_H_ |
| |
| #include <windows.media.playto.h> |
| #include <windows.graphics.printing.h> |
| #include <windows.ui.core.h> |
| |
| #include "base/synchronization/lock.h" |
| #include "base/threading/thread.h" |
| #include "win8/metro_driver/print_document_source.h" |
| #include "win8/metro_driver/winrt_utils.h" |
| |
| namespace base { |
| |
| class Lock; |
| |
| } // namespace base |
| |
| namespace metro_driver { |
| |
| // This class handles the print aspect of the devices charm. |
| class PrintHandler { |
| public: |
| PrintHandler(); |
| ~PrintHandler(); |
| |
| HRESULT Initialize(winui::Core::ICoreWindow* window); |
| |
| // Called by the exported C functions. |
| static void EnablePrinting(bool printing_enabled); |
| static void SetPageCount(size_t page_count); |
| static void AddPage(size_t page_number, IStream* metafile_stream); |
| static void ShowPrintUI(); |
| |
| private: |
| // Callbacks from Metro. |
| HRESULT OnPrintRequested( |
| wingfx::Printing::IPrintManager* print_mgr, |
| wingfx::Printing::IPrintTaskRequestedEventArgs* event_args); |
| |
| HRESULT OnPrintTaskSourceRequest( |
| wingfx::Printing::IPrintTaskSourceRequestedArgs* args); |
| |
| HRESULT OnCompleted(wingfx::Printing::IPrintTask* task, |
| wingfx::Printing::IPrintTaskCompletedEventArgs* args); |
| // Utility methods. |
| void ClearPrintTask(); |
| float GetLogicalDpi(); |
| |
| // Callback from Metro and entry point called on lockable thread. |
| HRESULT LogicalDpiChanged(IInspectable *sender); |
| static void OnLogicalDpiChanged(float dpi); |
| |
| // Called on the lockable thread to set/release the doc. |
| static void SetPrintDocumentSource( |
| const mswr::ComPtr<PrintDocumentSource>& print_document_source); |
| static void ReleasePrintDocumentSource(); |
| |
| // Called on the lockable thread for the exported C functions. |
| static void OnEnablePrinting(bool printing_enabled); |
| static void OnSetPageCount(size_t page_count); |
| static void OnAddPage(size_t page_number, |
| mswr::ComPtr<IStream> metafile_stream); |
| |
| // Opens the prit device charm. Must be called from the metro thread. |
| static void OnShowPrintUI(); |
| |
| mswr::ComPtr<wingfx::Printing::IPrintTask> print_task_; |
| EventRegistrationToken print_requested_token_; |
| EventRegistrationToken print_completed_token_; |
| EventRegistrationToken dpi_change_token_; |
| |
| mswr::ComPtr<wingfx::Printing::IPrintManager> print_manager_; |
| PrintDocumentSource::DirectXContext directx_context_; |
| |
| // Hack to give access to the Print Document from the C style entry points. |
| // This will go away once we can pass a pointer to this interface down to |
| // the Chrome Browser as we send the command to print. |
| static mswr::ComPtr<PrintDocumentSource> current_document_source_; |
| |
| // Another hack to enable/disable printing from an exported C function. |
| // TODO(mad): Find a better way to do this... |
| static bool printing_enabled_; |
| |
| // This is also a temporary hack until we can pass down the print document |
| // to Chrome so it can call directly into it. We need to lock the access to |
| // current_document_source_. |
| static base::Lock* lock_; |
| |
| // This thread is used to send blocking jobs |
| // out of threads we don't want to block. |
| static base::Thread* thread_; |
| }; |
| |
| } // namespace metro_driver |
| |
| // Exported C functions for Chrome to call into the Metro module. |
| extern "C" __declspec(dllexport) |
| void MetroEnablePrinting(BOOL printing_enabled); |
| |
| extern "C" __declspec(dllexport) |
| void MetroSetPrintPageCount(size_t page_count); |
| |
| extern "C" __declspec(dllexport) |
| void MetroSetPrintPageContent(size_t current_page, |
| void* data, |
| size_t data_size); |
| |
| extern "C" __declspec(dllexport) |
| void MetroShowPrintUI(); |
| |
| #endif // CHROME_BROWSER_UI_METRO_DRIVER_PRINT_HANDLER_H_ |