- add sources.
[platform/framework/web/crosswalk.git] / src / win8 / metro_driver / print_handler.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_UI_METRO_DRIVER_PRINT_HANDLER_H_
6 #define CHROME_BROWSER_UI_METRO_DRIVER_PRINT_HANDLER_H_
7
8 #include <windows.media.playto.h>
9 #include <windows.graphics.printing.h>
10 #include <windows.ui.core.h>
11
12 #include "base/synchronization/lock.h"
13 #include "base/threading/thread.h"
14 #include "win8/metro_driver/print_document_source.h"
15 #include "win8/metro_driver/winrt_utils.h"
16
17 namespace base {
18
19 class Lock;
20
21 }  // namespace base
22
23 namespace metro_driver {
24
25 // This class handles the print aspect of the devices charm.
26 class PrintHandler {
27  public:
28   PrintHandler();
29   ~PrintHandler();
30
31   HRESULT Initialize(winui::Core::ICoreWindow* window);
32
33   // Called by the exported C functions.
34   static void EnablePrinting(bool printing_enabled);
35   static void SetPageCount(size_t page_count);
36   static void AddPage(size_t page_number, IStream* metafile_stream);
37   static void ShowPrintUI();
38
39  private:
40   // Callbacks from Metro.
41   HRESULT OnPrintRequested(
42       wingfx::Printing::IPrintManager* print_mgr,
43       wingfx::Printing::IPrintTaskRequestedEventArgs* event_args);
44
45   HRESULT OnPrintTaskSourceRequest(
46       wingfx::Printing::IPrintTaskSourceRequestedArgs* args);
47
48   HRESULT OnCompleted(wingfx::Printing::IPrintTask* task,
49                       wingfx::Printing::IPrintTaskCompletedEventArgs* args);
50   // Utility methods.
51   void ClearPrintTask();
52   float GetLogicalDpi();
53
54   // Callback from Metro and entry point called on lockable thread.
55   HRESULT LogicalDpiChanged(IInspectable *sender);
56   static void OnLogicalDpiChanged(float dpi);
57
58   // Called on the lockable thread to set/release the doc.
59   static void SetPrintDocumentSource(
60       const mswr::ComPtr<PrintDocumentSource>& print_document_source);
61   static void ReleasePrintDocumentSource();
62
63   // Called on the lockable thread for the exported C functions.
64   static void OnEnablePrinting(bool printing_enabled);
65   static void OnSetPageCount(size_t page_count);
66   static void OnAddPage(size_t page_number,
67                         mswr::ComPtr<IStream> metafile_stream);
68
69   // Opens the prit device charm. Must be called from the metro thread.
70   static void OnShowPrintUI();
71
72   mswr::ComPtr<wingfx::Printing::IPrintTask> print_task_;
73   EventRegistrationToken print_requested_token_;
74   EventRegistrationToken print_completed_token_;
75   EventRegistrationToken dpi_change_token_;
76
77   mswr::ComPtr<wingfx::Printing::IPrintManager> print_manager_;
78   PrintDocumentSource::DirectXContext directx_context_;
79
80   // Hack to give access to the Print Document from the C style entry points.
81   // This will go away once we can pass a pointer to this interface down to
82   // the Chrome Browser as we send the command to print.
83   static mswr::ComPtr<PrintDocumentSource> current_document_source_;
84
85   // Another hack to enable/disable printing from an exported C function.
86   // TODO(mad): Find a better way to do this...
87   static bool printing_enabled_;
88
89   // This is also a temporary hack until we can pass down the print document
90   // to Chrome so it can call directly into it. We need to lock the access to
91   // current_document_source_.
92   static base::Lock* lock_;
93
94   // This thread is used to send blocking jobs
95   // out of threads we don't want to block.
96   static base::Thread* thread_;
97 };
98
99 }  // namespace metro_driver
100
101 // Exported C functions for Chrome to call into the Metro module.
102 extern "C" __declspec(dllexport)
103 void MetroEnablePrinting(BOOL printing_enabled);
104
105 extern "C" __declspec(dllexport)
106 void MetroSetPrintPageCount(size_t page_count);
107
108 extern "C" __declspec(dllexport)
109 void MetroSetPrintPageContent(size_t current_page,
110                               void* data,
111                               size_t data_size);
112
113 extern "C" __declspec(dllexport)
114 void MetroShowPrintUI();
115
116 #endif  // CHROME_BROWSER_UI_METRO_DRIVER_PRINT_HANDLER_H_