/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef nsPrinterListBase_h__ #define nsPrinterListBase_h__ #include "nsIPrinterList.h" #include "nsCycleCollectionParticipant.h" #include "nsISupportsImpl.h" #include "nsPaper.h" #include "nsString.h" class nsPrinterListBase : public nsIPrinterList { public: using Promise = mozilla::dom::Promise; NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_CLASS(nsPrinterListBase) NS_IMETHOD GetSystemDefaultPrinterName(nsAString& aName) final { return SystemDefaultPrinterName(aName); } NS_IMETHOD GetPrinters(JSContext*, Promise**) final; NS_IMETHOD GetPrinterByName(const nsAString& aPrinterName, JSContext* aCx, Promise** aResult) final; NS_IMETHOD GetPrinterBySystemName(const nsAString& aPrinterName, JSContext* aCx, Promise** aResult) final; NS_IMETHOD GetNamedOrDefaultPrinter(const nsAString& aPrinterName, JSContext* aCx, Promise** aResult) final; NS_IMETHOD GetFallbackPaperList(JSContext*, Promise**) final; struct PrinterInfo { // Both windows and CUPS: The name of the printer. nsString mName; // CUPS only: Handle to owned cups_dest_t. void* mCupsHandle = nullptr; }; // Called off the main thread, collect information to create an appropriate // list of printers. virtual nsTArray Printers() const = 0; // Create an nsIPrinter object given the information we obtained from the // background thread. virtual RefPtr CreatePrinter(PrinterInfo) const = 0; mozilla::Maybe NamedOrDefaultPrinter(nsString aName) const; // No copy or move, we're an identity. nsPrinterListBase(const nsPrinterListBase&) = delete; nsPrinterListBase(nsPrinterListBase&&) = delete; protected: nsPrinterListBase(); virtual ~nsPrinterListBase(); // This could be implemented in terms of Printers() and then searching the // returned printer info for a printer of the given name, but we expect // backends to have more efficient methods of implementing this. virtual mozilla::Maybe PrinterByName(nsString aName) const = 0; // Same as NamedPrinter, but uses the system name. // Depending on whether or not there is a more efficient way to address the // printer for a given backend, this may or may not be equivalent to // NamedPrinter. virtual mozilla::Maybe PrinterBySystemName( nsString aName) const = 0; // This is implemented separately from the IDL interface version so that it // can be made const, which allows it to be used while resolving promises. virtual nsresult SystemDefaultPrinterName(nsAString&) const = 0; // Return "paper" sizes to be supported by the Save to PDF destination; // for actual printer drivers the list is retrieved from nsIPrinter. nsTArray> FallbackPaperList() const; // Constructs mCommonPaperInfo by localizing the sizes in // nsPaper::kCommonPaperSizes and creating corresponding PaperInfo. void EnsureCommonPaperInfo(JSContext* aCx); RefPtr mPrintersPromise; // PaperInfo for our fallback sizes and common size localization. // This field contains the same data for every instance of this class. // It's unfortunate that this needs to be a member rather than static data // like nsPaper::kCommonPaperSizes, but that's because PaperInfo contains // localized data, and we need a JSContext to do the localization. RefPtr mCommonPaperInfo; }; #endif