Home | History | Annotate | Download | only in metro_driver
      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_
    117