diff options
Diffstat (limited to 'win8/metro_driver/print_handler.h')
-rw-r--r-- | win8/metro_driver/print_handler.h | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/win8/metro_driver/print_handler.h b/win8/metro_driver/print_handler.h new file mode 100644 index 0000000..f0779cf --- /dev/null +++ b/win8/metro_driver/print_handler.h @@ -0,0 +1,116 @@ +// 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_ |