michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nsPrintOptionsImpl.h" michael@0: #include "nsReadableUtils.h" michael@0: #include "nsPrintSettingsImpl.h" michael@0: michael@0: #include "nsIDOMWindow.h" michael@0: #include "nsIServiceManager.h" michael@0: #include "nsIDialogParamBlock.h" michael@0: #include "nsXPCOM.h" michael@0: #include "nsISupportsPrimitives.h" michael@0: #include "nsIWindowWatcher.h" michael@0: #include "nsISupportsArray.h" michael@0: #include "prprf.h" michael@0: michael@0: #include "nsIStringEnumerator.h" michael@0: #include "nsISupportsPrimitives.h" michael@0: #include "stdlib.h" michael@0: #include "nsAutoPtr.h" michael@0: #include "mozilla/Preferences.h" michael@0: #include "nsPrintfCString.h" michael@0: michael@0: using namespace mozilla; michael@0: michael@0: NS_IMPL_ISUPPORTS(nsPrintOptions, nsIPrintOptions, nsIPrintSettingsService) michael@0: michael@0: // Pref Constants michael@0: static const char kMarginTop[] = "print_margin_top"; michael@0: static const char kMarginLeft[] = "print_margin_left"; michael@0: static const char kMarginBottom[] = "print_margin_bottom"; michael@0: static const char kMarginRight[] = "print_margin_right"; michael@0: static const char kEdgeTop[] = "print_edge_top"; michael@0: static const char kEdgeLeft[] = "print_edge_left"; michael@0: static const char kEdgeBottom[] = "print_edge_bottom"; michael@0: static const char kEdgeRight[] = "print_edge_right"; michael@0: static const char kUnwriteableMarginTop[] = "print_unwriteable_margin_top"; michael@0: static const char kUnwriteableMarginLeft[] = "print_unwriteable_margin_left"; michael@0: static const char kUnwriteableMarginBottom[] = "print_unwriteable_margin_bottom"; michael@0: static const char kUnwriteableMarginRight[] = "print_unwriteable_margin_right"; michael@0: michael@0: // Prefs for Print Options michael@0: static const char kPrintEvenPages[] = "print_evenpages"; michael@0: static const char kPrintOddPages[] = "print_oddpages"; michael@0: static const char kPrintHeaderStrLeft[] = "print_headerleft"; michael@0: static const char kPrintHeaderStrCenter[] = "print_headercenter"; michael@0: static const char kPrintHeaderStrRight[] = "print_headerright"; michael@0: static const char kPrintFooterStrLeft[] = "print_footerleft"; michael@0: static const char kPrintFooterStrCenter[] = "print_footercenter"; michael@0: static const char kPrintFooterStrRight[] = "print_footerright"; michael@0: michael@0: // Additional Prefs michael@0: static const char kPrintReversed[] = "print_reversed"; michael@0: static const char kPrintInColor[] = "print_in_color"; michael@0: static const char kPrintPaperName[] = "print_paper_name"; michael@0: static const char kPrintPlexName[] = "print_plex_name"; michael@0: static const char kPrintPaperSizeType[] = "print_paper_size_type"; michael@0: static const char kPrintPaperData[] = "print_paper_data"; michael@0: static const char kPrintPaperSizeUnit[] = "print_paper_size_unit"; michael@0: static const char kPrintPaperWidth[] = "print_paper_width"; michael@0: static const char kPrintPaperHeight[] = "print_paper_height"; michael@0: static const char kPrintColorspace[] = "print_colorspace"; michael@0: static const char kPrintResolutionName[]= "print_resolution_name"; michael@0: static const char kPrintDownloadFonts[] = "print_downloadfonts"; michael@0: static const char kPrintOrientation[] = "print_orientation"; michael@0: static const char kPrintCommand[] = "print_command"; michael@0: static const char kPrinterName[] = "print_printer"; michael@0: static const char kPrintToFile[] = "print_to_file"; michael@0: static const char kPrintToFileName[] = "print_to_filename"; michael@0: static const char kPrintPageDelay[] = "print_page_delay"; michael@0: static const char kPrintBGColors[] = "print_bgcolor"; michael@0: static const char kPrintBGImages[] = "print_bgimages"; michael@0: static const char kPrintShrinkToFit[] = "print_shrink_to_fit"; michael@0: static const char kPrintScaling[] = "print_scaling"; michael@0: static const char kPrintResolution[] = "print_resolution"; michael@0: static const char kPrintDuplex[] = "print_duplex"; michael@0: michael@0: static const char kJustLeft[] = "left"; michael@0: static const char kJustCenter[] = "center"; michael@0: static const char kJustRight[] = "right"; michael@0: michael@0: #define NS_PRINTER_ENUMERATOR_CONTRACTID "@mozilla.org/gfx/printerenumerator;1" michael@0: michael@0: nsPrintOptions::nsPrintOptions() michael@0: { michael@0: } michael@0: michael@0: nsPrintOptions::~nsPrintOptions() michael@0: { michael@0: } michael@0: michael@0: nsresult michael@0: nsPrintOptions::Init() michael@0: { michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::ShowPrintSetupDialog(nsIPrintSettings *aPS) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPS); michael@0: nsresult rv; michael@0: michael@0: // create a nsISupportsArray of the parameters michael@0: // being passed to the window michael@0: nsCOMPtr array; michael@0: rv = NS_NewISupportsArray(getter_AddRefs(array)); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsCOMPtr psSupports = do_QueryInterface(aPS); michael@0: NS_ASSERTION(psSupports, "PrintSettings must be a supports"); michael@0: array->AppendElement(psSupports); michael@0: michael@0: nsCOMPtr ioParamBlock = michael@0: do_CreateInstance(NS_DIALOGPARAMBLOCK_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: ioParamBlock->SetInt(0, 0); michael@0: michael@0: nsCOMPtr blkSupps = do_QueryInterface(ioParamBlock); michael@0: NS_ASSERTION(blkSupps, "IOBlk must be a supports"); michael@0: array->AppendElement(blkSupps); michael@0: michael@0: nsCOMPtr wwatch = michael@0: do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsCOMPtr parent; michael@0: wwatch->GetActiveWindow(getter_AddRefs(parent)); michael@0: // null |parent| is non-fatal michael@0: michael@0: nsCOMPtr newWindow; michael@0: michael@0: return wwatch->OpenWindow(parent, michael@0: "chrome://global/content/printPageSetup.xul", michael@0: "_blank","chrome,modal,centerscreen", array, michael@0: getter_AddRefs(newWindow)); michael@0: } michael@0: michael@0: /** --------------------------------------------------- michael@0: * Helper function - Creates the "prefix" for the pref michael@0: * It is either "print." michael@0: * or "print.printer_." michael@0: */ michael@0: const char* michael@0: nsPrintOptions::GetPrefName(const char * aPrefName, michael@0: const nsAString& aPrinterName) michael@0: { michael@0: if (!aPrefName || !*aPrefName) { michael@0: NS_ERROR("Must have a valid pref name!"); michael@0: return aPrefName; michael@0: } michael@0: michael@0: mPrefName.AssignLiteral("print."); michael@0: michael@0: if (aPrinterName.Length()) { michael@0: mPrefName.AppendLiteral("printer_"); michael@0: AppendUTF16toUTF8(aPrinterName, mPrefName); michael@0: mPrefName.AppendLiteral("."); michael@0: } michael@0: mPrefName += aPrefName; michael@0: michael@0: return mPrefName.get(); michael@0: } michael@0: michael@0: //---------------------------------------------------------------------- michael@0: // Testing of read/write prefs michael@0: // This define controls debug output michael@0: #ifdef DEBUG_rods_X michael@0: static void WriteDebugStr(const char* aArg1, const char* aArg2, michael@0: const char16_t* aStr) michael@0: { michael@0: nsString str(aStr); michael@0: char16_t s = '&'; michael@0: char16_t r = '_'; michael@0: str.ReplaceChar(s, r); michael@0: michael@0: printf("%s %s = %s \n", aArg1, aArg2, ToNewUTF8String(str)); michael@0: } michael@0: const char* kWriteStr = "Write Pref:"; michael@0: const char* kReadStr = "Read Pref:"; michael@0: #define DUMP_STR(_a1, _a2, _a3) WriteDebugStr((_a1), GetPrefName((_a2), \ michael@0: aPrefName), (_a3)); michael@0: #define DUMP_BOOL(_a1, _a2, _a3) printf("%s %s = %s \n", (_a1), \ michael@0: GetPrefName((_a2), aPrefName), (_a3)?"T":"F"); michael@0: #define DUMP_INT(_a1, _a2, _a3) printf("%s %s = %d \n", (_a1), \ michael@0: GetPrefName((_a2), aPrefName), (_a3)); michael@0: #define DUMP_DBL(_a1, _a2, _a3) printf("%s %s = %10.5f \n", (_a1), \ michael@0: GetPrefName((_a2), aPrefName), (_a3)); michael@0: #else michael@0: #define DUMP_STR(_a1, _a2, _a3) michael@0: #define DUMP_BOOL(_a1, _a2, _a3) michael@0: #define DUMP_INT(_a1, _a2, _a3) michael@0: #define DUMP_DBL(_a1, _a2, _a3) michael@0: #endif /* DEBUG_rods_X */ michael@0: //---------------------------------------------------------------------- michael@0: michael@0: /** michael@0: * This will either read in the generic prefs (not specific to a printer) michael@0: * or read the prefs in using the printer name to qualify. michael@0: * It is either "print.attr_name" or "print.printer_HPLasr5.attr_name" michael@0: */ michael@0: nsresult michael@0: nsPrintOptions::ReadPrefs(nsIPrintSettings* aPS, const nsAString& aPrinterName, michael@0: uint32_t aFlags) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPS); michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveMargins) { michael@0: int32_t halfInch = NS_INCHES_TO_INT_TWIPS(0.5); michael@0: nsIntMargin margin(halfInch, halfInch, halfInch, halfInch); michael@0: ReadInchesToTwipsPref(GetPrefName(kMarginTop, aPrinterName), margin.top, michael@0: kMarginTop); michael@0: DUMP_INT(kReadStr, kMarginTop, margin.top); michael@0: ReadInchesToTwipsPref(GetPrefName(kMarginLeft, aPrinterName), margin.left, michael@0: kMarginLeft); michael@0: DUMP_INT(kReadStr, kMarginLeft, margin.left); michael@0: ReadInchesToTwipsPref(GetPrefName(kMarginBottom, aPrinterName), michael@0: margin.bottom, kMarginBottom); michael@0: DUMP_INT(kReadStr, kMarginBottom, margin.bottom); michael@0: ReadInchesToTwipsPref(GetPrefName(kMarginRight, aPrinterName), margin.right, michael@0: kMarginRight); michael@0: DUMP_INT(kReadStr, kMarginRight, margin.right); michael@0: aPS->SetMarginInTwips(margin); michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveEdges) { michael@0: nsIntMargin margin(0,0,0,0); michael@0: ReadInchesIntToTwipsPref(GetPrefName(kEdgeTop, aPrinterName), margin.top, michael@0: kEdgeTop); michael@0: DUMP_INT(kReadStr, kEdgeTop, margin.top); michael@0: ReadInchesIntToTwipsPref(GetPrefName(kEdgeLeft, aPrinterName), margin.left, michael@0: kEdgeLeft); michael@0: DUMP_INT(kReadStr, kEdgeLeft, margin.left); michael@0: ReadInchesIntToTwipsPref(GetPrefName(kEdgeBottom, aPrinterName), michael@0: margin.bottom, kEdgeBottom); michael@0: DUMP_INT(kReadStr, kEdgeBottom, margin.bottom); michael@0: ReadInchesIntToTwipsPref(GetPrefName(kEdgeRight, aPrinterName), margin.right, michael@0: kEdgeRight); michael@0: DUMP_INT(kReadStr, kEdgeRight, margin.right); michael@0: aPS->SetEdgeInTwips(margin); michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveUnwriteableMargins) { michael@0: nsIntMargin margin; michael@0: ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginTop, aPrinterName), margin.top, michael@0: kUnwriteableMarginTop); michael@0: DUMP_INT(kReadStr, kUnwriteableMarginTop, margin.top); michael@0: ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginLeft, aPrinterName), margin.left, michael@0: kUnwriteableMarginLeft); michael@0: DUMP_INT(kReadStr, kUnwriteableMarginLeft, margin.left); michael@0: ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginBottom, aPrinterName), michael@0: margin.bottom, kUnwriteableMarginBottom); michael@0: DUMP_INT(kReadStr, kUnwriteableMarginBottom, margin.bottom); michael@0: ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginRight, aPrinterName), margin.right, michael@0: kUnwriteableMarginRight); michael@0: DUMP_INT(kReadStr, kUnwriteableMarginRight, margin.right); michael@0: aPS->SetUnwriteableMarginInTwips(margin); michael@0: } michael@0: michael@0: bool b; michael@0: nsAutoString str; michael@0: int32_t iVal; michael@0: double dbl; michael@0: michael@0: #define GETBOOLPREF(_prefname, _retval) \ michael@0: NS_SUCCEEDED( \ michael@0: Preferences::GetBool( \ michael@0: GetPrefName(_prefname, aPrinterName), _retval \ michael@0: ) \ michael@0: ) michael@0: michael@0: #define GETSTRPREF(_prefname, _retval) \ michael@0: NS_SUCCEEDED( \ michael@0: Preferences::GetString( \ michael@0: GetPrefName(_prefname, aPrinterName), _retval \ michael@0: ) \ michael@0: ) michael@0: michael@0: #define GETINTPREF(_prefname, _retval) \ michael@0: NS_SUCCEEDED( \ michael@0: Preferences::GetInt( \ michael@0: GetPrefName(_prefname, aPrinterName), _retval \ michael@0: ) \ michael@0: ) michael@0: michael@0: #define GETDBLPREF(_prefname, _retval) \ michael@0: NS_SUCCEEDED( \ michael@0: ReadPrefDouble( \ michael@0: GetPrefName(_prefname, aPrinterName), _retval \ michael@0: ) \ michael@0: ) michael@0: michael@0: // Paper size prefs are read as a group michael@0: if (aFlags & nsIPrintSettings::kInitSavePaperSize) { michael@0: int32_t sizeUnit, sizeType; michael@0: double width, height; michael@0: michael@0: bool success = GETINTPREF(kPrintPaperSizeUnit, &sizeUnit) michael@0: && GETINTPREF(kPrintPaperSizeType, &sizeType) michael@0: && GETDBLPREF(kPrintPaperWidth, width) michael@0: && GETDBLPREF(kPrintPaperHeight, height) michael@0: && GETSTRPREF(kPrintPaperName, &str); michael@0: michael@0: // Bug 315687: Sanity check paper size to avoid paper size values in michael@0: // mm when the size unit flag is inches. The value 100 is arbitrary michael@0: // and can be changed. michael@0: if (success) { michael@0: success = (sizeUnit != nsIPrintSettings::kPaperSizeInches) michael@0: || (width < 100.0) michael@0: || (height < 100.0); michael@0: } michael@0: michael@0: if (success) { michael@0: aPS->SetPaperSizeUnit(sizeUnit); michael@0: DUMP_INT(kReadStr, kPrintPaperSizeUnit, sizeUnit); michael@0: aPS->SetPaperSizeType(sizeType); michael@0: DUMP_INT(kReadStr, kPrintPaperSizeType, sizeType); michael@0: aPS->SetPaperWidth(width); michael@0: DUMP_DBL(kReadStr, kPrintPaperWidth, width); michael@0: aPS->SetPaperHeight(height); michael@0: DUMP_DBL(kReadStr, kPrintPaperHeight, height); michael@0: aPS->SetPaperName(str.get()); michael@0: DUMP_STR(kReadStr, kPrintPaperName, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveOddEvenPages) { michael@0: if (GETBOOLPREF(kPrintEvenPages, &b)) { michael@0: aPS->SetPrintOptions(nsIPrintSettings::kPrintEvenPages, b); michael@0: DUMP_BOOL(kReadStr, kPrintEvenPages, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveOddEvenPages) { michael@0: if (GETBOOLPREF(kPrintOddPages, &b)) { michael@0: aPS->SetPrintOptions(nsIPrintSettings::kPrintOddPages, b); michael@0: DUMP_BOOL(kReadStr, kPrintOddPages, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveHeaderLeft) { michael@0: if (GETSTRPREF(kPrintHeaderStrLeft, &str)) { michael@0: aPS->SetHeaderStrLeft(str.get()); michael@0: DUMP_STR(kReadStr, kPrintHeaderStrLeft, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveHeaderCenter) { michael@0: if (GETSTRPREF(kPrintHeaderStrCenter, &str)) { michael@0: aPS->SetHeaderStrCenter(str.get()); michael@0: DUMP_STR(kReadStr, kPrintHeaderStrCenter, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveHeaderRight) { michael@0: if (GETSTRPREF(kPrintHeaderStrRight, &str)) { michael@0: aPS->SetHeaderStrRight(str.get()); michael@0: DUMP_STR(kReadStr, kPrintHeaderStrRight, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveFooterLeft) { michael@0: if (GETSTRPREF(kPrintFooterStrLeft, &str)) { michael@0: aPS->SetFooterStrLeft(str.get()); michael@0: DUMP_STR(kReadStr, kPrintFooterStrLeft, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveFooterCenter) { michael@0: if (GETSTRPREF(kPrintFooterStrCenter, &str)) { michael@0: aPS->SetFooterStrCenter(str.get()); michael@0: DUMP_STR(kReadStr, kPrintFooterStrCenter, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveFooterRight) { michael@0: if (GETSTRPREF(kPrintFooterStrRight, &str)) { michael@0: aPS->SetFooterStrRight(str.get()); michael@0: DUMP_STR(kReadStr, kPrintFooterStrRight, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveBGColors) { michael@0: if (GETBOOLPREF(kPrintBGColors, &b)) { michael@0: aPS->SetPrintBGColors(b); michael@0: DUMP_BOOL(kReadStr, kPrintBGColors, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveBGImages) { michael@0: if (GETBOOLPREF(kPrintBGImages, &b)) { michael@0: aPS->SetPrintBGImages(b); michael@0: DUMP_BOOL(kReadStr, kPrintBGImages, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveReversed) { michael@0: if (GETBOOLPREF(kPrintReversed, &b)) { michael@0: aPS->SetPrintReversed(b); michael@0: DUMP_BOOL(kReadStr, kPrintReversed, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveInColor) { michael@0: if (GETBOOLPREF(kPrintInColor, &b)) { michael@0: aPS->SetPrintInColor(b); michael@0: DUMP_BOOL(kReadStr, kPrintInColor, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePlexName) { michael@0: if (GETSTRPREF(kPrintPlexName, &str)) { michael@0: aPS->SetPlexName(str.get()); michael@0: DUMP_STR(kReadStr, kPrintPlexName, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePaperData) { michael@0: if (GETINTPREF(kPrintPaperData, &iVal)) { michael@0: aPS->SetPaperData(iVal); michael@0: DUMP_INT(kReadStr, kPrintPaperData, iVal); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveColorspace) { michael@0: if (GETSTRPREF(kPrintColorspace, &str)) { michael@0: aPS->SetColorspace(str.get()); michael@0: DUMP_STR(kReadStr, kPrintColorspace, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveResolutionName) { michael@0: if (GETSTRPREF(kPrintResolutionName, &str)) { michael@0: aPS->SetResolutionName(str.get()); michael@0: DUMP_STR(kReadStr, kPrintResolutionName, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveDownloadFonts) { michael@0: if (GETBOOLPREF(kPrintDownloadFonts, &b)) { michael@0: aPS->SetDownloadFonts(b); michael@0: DUMP_BOOL(kReadStr, kPrintDownloadFonts, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveOrientation) { michael@0: if (GETINTPREF(kPrintOrientation, &iVal)) { michael@0: aPS->SetOrientation(iVal); michael@0: DUMP_INT(kReadStr, kPrintOrientation, iVal); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePrintCommand) { michael@0: if (GETSTRPREF(kPrintCommand, &str)) { michael@0: aPS->SetPrintCommand(str.get()); michael@0: DUMP_STR(kReadStr, kPrintCommand, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePrintToFile) { michael@0: if (GETBOOLPREF(kPrintToFile, &b)) { michael@0: aPS->SetPrintToFile(b); michael@0: DUMP_BOOL(kReadStr, kPrintToFile, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveToFileName) { michael@0: if (GETSTRPREF(kPrintToFileName, &str)) { michael@0: aPS->SetToFileName(str.get()); michael@0: DUMP_STR(kReadStr, kPrintToFileName, str.get()); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePageDelay) { michael@0: if (GETINTPREF(kPrintPageDelay, &iVal)) { michael@0: aPS->SetPrintPageDelay(iVal); michael@0: DUMP_INT(kReadStr, kPrintPageDelay, iVal); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveShrinkToFit) { michael@0: if (GETBOOLPREF(kPrintShrinkToFit, &b)) { michael@0: aPS->SetShrinkToFit(b); michael@0: DUMP_BOOL(kReadStr, kPrintShrinkToFit, b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveScaling) { michael@0: if (GETDBLPREF(kPrintScaling, dbl)) { michael@0: aPS->SetScaling(dbl); michael@0: DUMP_DBL(kReadStr, kPrintScaling, dbl); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveResolution) { michael@0: if (GETINTPREF(kPrintResolution, &iVal)) { michael@0: aPS->SetResolution(iVal); michael@0: DUMP_INT(kReadStr, kPrintResolution, iVal); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveDuplex) { michael@0: if (GETINTPREF(kPrintDuplex, &iVal)) { michael@0: aPS->SetDuplex(iVal); michael@0: DUMP_INT(kReadStr, kPrintDuplex, iVal); michael@0: } michael@0: } michael@0: michael@0: // Not Reading In: michael@0: // Number of Copies michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /** --------------------------------------------------- michael@0: * See documentation in nsPrintOptionsImpl.h michael@0: * @update 1/12/01 rods michael@0: */ michael@0: nsresult michael@0: nsPrintOptions::WritePrefs(nsIPrintSettings *aPS, const nsAString& aPrinterName, michael@0: uint32_t aFlags) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPS); michael@0: michael@0: bool persistMarginBoxSettings; michael@0: aPS->GetPersistMarginBoxSettings(&persistMarginBoxSettings); michael@0: michael@0: nsIntMargin margin; michael@0: if (aFlags & nsIPrintSettings::kInitSaveMargins) { michael@0: if (NS_SUCCEEDED(aPS->GetMarginInTwips(margin))) { michael@0: WriteInchesFromTwipsPref(GetPrefName(kMarginTop, aPrinterName), michael@0: margin.top); michael@0: DUMP_INT(kWriteStr, kMarginTop, margin.top); michael@0: WriteInchesFromTwipsPref(GetPrefName(kMarginLeft, aPrinterName), michael@0: margin.left); michael@0: DUMP_INT(kWriteStr, kMarginLeft, margin.top); michael@0: WriteInchesFromTwipsPref(GetPrefName(kMarginBottom, aPrinterName), michael@0: margin.bottom); michael@0: DUMP_INT(kWriteStr, kMarginBottom, margin.top); michael@0: WriteInchesFromTwipsPref(GetPrefName(kMarginRight, aPrinterName), michael@0: margin.right); michael@0: DUMP_INT(kWriteStr, kMarginRight, margin.top); michael@0: } michael@0: } michael@0: michael@0: nsIntMargin edge; michael@0: if (aFlags & nsIPrintSettings::kInitSaveEdges) { michael@0: if (NS_SUCCEEDED(aPS->GetEdgeInTwips(edge))) { michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kEdgeTop, aPrinterName), michael@0: edge.top); michael@0: DUMP_INT(kWriteStr, kEdgeTop, edge.top); michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kEdgeLeft, aPrinterName), michael@0: edge.left); michael@0: DUMP_INT(kWriteStr, kEdgeLeft, edge.top); michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kEdgeBottom, aPrinterName), michael@0: edge.bottom); michael@0: DUMP_INT(kWriteStr, kEdgeBottom, edge.top); michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kEdgeRight, aPrinterName), michael@0: edge.right); michael@0: DUMP_INT(kWriteStr, kEdgeRight, edge.top); michael@0: } michael@0: } michael@0: michael@0: nsIntMargin unwriteableMargin; michael@0: if (aFlags & nsIPrintSettings::kInitSaveUnwriteableMargins) { michael@0: if (NS_SUCCEEDED(aPS->GetUnwriteableMarginInTwips(unwriteableMargin))) { michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginTop, aPrinterName), michael@0: unwriteableMargin.top); michael@0: DUMP_INT(kWriteStr, kUnwriteableMarginTop, unwriteableMargin.top); michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginLeft, aPrinterName), michael@0: unwriteableMargin.left); michael@0: DUMP_INT(kWriteStr, kUnwriteableMarginLeft, unwriteableMargin.top); michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginBottom, aPrinterName), michael@0: unwriteableMargin.bottom); michael@0: DUMP_INT(kWriteStr, kUnwriteableMarginBottom, unwriteableMargin.top); michael@0: WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginRight, aPrinterName), michael@0: unwriteableMargin.right); michael@0: DUMP_INT(kWriteStr, kUnwriteableMarginRight, unwriteableMargin.top); michael@0: } michael@0: } michael@0: michael@0: // Paper size prefs are saved as a group michael@0: if (aFlags & nsIPrintSettings::kInitSavePaperSize) { michael@0: int16_t sizeUnit, sizeType; michael@0: double width, height; michael@0: char16_t *name; michael@0: michael@0: if ( michael@0: NS_SUCCEEDED(aPS->GetPaperSizeUnit(&sizeUnit)) && michael@0: NS_SUCCEEDED(aPS->GetPaperSizeType(&sizeType)) && michael@0: NS_SUCCEEDED(aPS->GetPaperWidth(&width)) && michael@0: NS_SUCCEEDED(aPS->GetPaperHeight(&height)) && michael@0: NS_SUCCEEDED(aPS->GetPaperName(&name)) michael@0: ) { michael@0: DUMP_INT(kWriteStr, kPrintPaperSizeUnit, sizeUnit); michael@0: Preferences::SetInt(GetPrefName(kPrintPaperSizeUnit, aPrinterName), michael@0: int32_t(sizeUnit)); michael@0: DUMP_INT(kWriteStr, kPrintPaperSizeType, sizeType); michael@0: Preferences::SetInt(GetPrefName(kPrintPaperSizeType, aPrinterName), michael@0: int32_t(sizeType)); michael@0: DUMP_DBL(kWriteStr, kPrintPaperWidth, width); michael@0: WritePrefDouble(GetPrefName(kPrintPaperWidth, aPrinterName), width); michael@0: DUMP_DBL(kWriteStr, kPrintPaperHeight, height); michael@0: WritePrefDouble(GetPrefName(kPrintPaperHeight, aPrinterName), height); michael@0: DUMP_STR(kWriteStr, kPrintPaperName, name); michael@0: Preferences::SetString(GetPrefName(kPrintPaperName, aPrinterName), name); michael@0: } michael@0: } michael@0: michael@0: bool b; michael@0: char16_t* uStr; michael@0: int32_t iVal; michael@0: int16_t iVal16; michael@0: double dbl; michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveOddEvenPages) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintOptions(nsIPrintSettings::kPrintEvenPages, michael@0: &b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintEvenPages, b); michael@0: Preferences::SetBool(GetPrefName(kPrintEvenPages, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveOddEvenPages) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintOptions(nsIPrintSettings::kPrintOddPages, michael@0: &b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintOddPages, b); michael@0: Preferences::SetBool(GetPrefName(kPrintOddPages, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (persistMarginBoxSettings) { michael@0: if (aFlags & nsIPrintSettings::kInitSaveHeaderLeft) { michael@0: if (NS_SUCCEEDED(aPS->GetHeaderStrLeft(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintHeaderStrLeft, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintHeaderStrLeft, aPrinterName), michael@0: uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveHeaderCenter) { michael@0: if (NS_SUCCEEDED(aPS->GetHeaderStrCenter(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintHeaderStrCenter, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintHeaderStrCenter, aPrinterName), michael@0: uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveHeaderRight) { michael@0: if (NS_SUCCEEDED(aPS->GetHeaderStrRight(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintHeaderStrRight, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintHeaderStrRight, aPrinterName), michael@0: uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveFooterLeft) { michael@0: if (NS_SUCCEEDED(aPS->GetFooterStrLeft(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintFooterStrLeft, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintFooterStrLeft, aPrinterName), michael@0: uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveFooterCenter) { michael@0: if (NS_SUCCEEDED(aPS->GetFooterStrCenter(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintFooterStrCenter, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintFooterStrCenter, aPrinterName), michael@0: uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveFooterRight) { michael@0: if (NS_SUCCEEDED(aPS->GetFooterStrRight(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintFooterStrRight, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintFooterStrRight, aPrinterName), michael@0: uStr); michael@0: } michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveBGColors) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintBGColors(&b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintBGColors, b); michael@0: Preferences::SetBool(GetPrefName(kPrintBGColors, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveBGImages) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintBGImages(&b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintBGImages, b); michael@0: Preferences::SetBool(GetPrefName(kPrintBGImages, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveReversed) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintReversed(&b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintReversed, b); michael@0: Preferences::SetBool(GetPrefName(kPrintReversed, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveInColor) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintInColor(&b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintInColor, b); michael@0: Preferences::SetBool(GetPrefName(kPrintInColor, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePlexName) { michael@0: if (NS_SUCCEEDED(aPS->GetPlexName(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintPlexName, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintPlexName, aPrinterName), uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePaperData) { michael@0: if (NS_SUCCEEDED(aPS->GetPaperData(&iVal16))) { michael@0: DUMP_INT(kWriteStr, kPrintPaperData, iVal16); michael@0: Preferences::SetInt(GetPrefName(kPrintPaperData, aPrinterName), michael@0: int32_t(iVal16)); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveColorspace) { michael@0: if (NS_SUCCEEDED(aPS->GetColorspace(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintColorspace, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintColorspace, aPrinterName), uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveResolutionName) { michael@0: if (NS_SUCCEEDED(aPS->GetResolutionName(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintResolutionName, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintResolutionName, aPrinterName), michael@0: uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveDownloadFonts) { michael@0: if (NS_SUCCEEDED(aPS->GetDownloadFonts(&b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintDownloadFonts, b); michael@0: Preferences::SetBool(GetPrefName(kPrintDownloadFonts, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveOrientation) { michael@0: if (NS_SUCCEEDED(aPS->GetOrientation(&iVal))) { michael@0: DUMP_INT(kWriteStr, kPrintOrientation, iVal); michael@0: Preferences::SetInt(GetPrefName(kPrintOrientation, aPrinterName), iVal); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePrintCommand) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintCommand(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintCommand, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintCommand, aPrinterName), uStr); michael@0: } michael@0: } michael@0: michael@0: // Only the general version of this pref is saved michael@0: if ((aFlags & nsIPrintSettings::kInitSavePrinterName) michael@0: && aPrinterName.IsEmpty()) { michael@0: if (NS_SUCCEEDED(aPS->GetPrinterName(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrinterName, uStr); michael@0: Preferences::SetString(kPrinterName, uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePrintToFile) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintToFile(&b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintToFile, b); michael@0: Preferences::SetBool(GetPrefName(kPrintToFile, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveToFileName) { michael@0: if (NS_SUCCEEDED(aPS->GetToFileName(&uStr))) { michael@0: DUMP_STR(kWriteStr, kPrintToFileName, uStr); michael@0: Preferences::SetString(GetPrefName(kPrintToFileName, aPrinterName), uStr); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSavePageDelay) { michael@0: if (NS_SUCCEEDED(aPS->GetPrintPageDelay(&iVal))) { michael@0: DUMP_INT(kWriteStr, kPrintPageDelay, iVal); michael@0: Preferences::SetInt(GetPrefName(kPrintPageDelay, aPrinterName), iVal); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveShrinkToFit) { michael@0: if (NS_SUCCEEDED(aPS->GetShrinkToFit(&b))) { michael@0: DUMP_BOOL(kWriteStr, kPrintShrinkToFit, b); michael@0: Preferences::SetBool(GetPrefName(kPrintShrinkToFit, aPrinterName), b); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveScaling) { michael@0: if (NS_SUCCEEDED(aPS->GetScaling(&dbl))) { michael@0: DUMP_DBL(kWriteStr, kPrintScaling, dbl); michael@0: WritePrefDouble(GetPrefName(kPrintScaling, aPrinterName), dbl); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveResolution) { michael@0: if (NS_SUCCEEDED(aPS->GetResolution(&iVal))) { michael@0: DUMP_INT(kWriteStr, kPrintResolution, iVal); michael@0: Preferences::SetInt(GetPrefName(kPrintResolution, aPrinterName), iVal); michael@0: } michael@0: } michael@0: michael@0: if (aFlags & nsIPrintSettings::kInitSaveDuplex) { michael@0: if (NS_SUCCEEDED(aPS->GetDuplex(&iVal))) { michael@0: DUMP_INT(kWriteStr, kPrintDuplex, iVal); michael@0: Preferences::SetInt(GetPrefName(kPrintDuplex, aPrinterName), iVal); michael@0: } michael@0: } michael@0: michael@0: // Not Writing Out: michael@0: // Number of Copies michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::DisplayJobProperties(const char16_t *aPrinter, michael@0: nsIPrintSettings* aPrintSettings, michael@0: bool *aDisplayed) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPrinter); michael@0: *aDisplayed = false; michael@0: michael@0: nsresult rv; michael@0: nsCOMPtr propDlg = michael@0: do_CreateInstance(NS_PRINTER_ENUMERATOR_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: NS_ENSURE_ARG_POINTER(aPrintSettings); michael@0: rv = propDlg->DisplayPropertiesDlg(aPrinter, aPrintSettings); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: *aDisplayed = true; michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsPrintOptions::GetNativeData(int16_t aDataType, void * *_retval) michael@0: { michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: nsresult nsPrintOptions::_CreatePrintSettings(nsIPrintSettings **_retval) michael@0: { michael@0: // does not initially ref count michael@0: nsPrintSettings * printSettings = new nsPrintSettings(); michael@0: NS_ENSURE_TRUE(printSettings, NS_ERROR_OUT_OF_MEMORY); michael@0: michael@0: NS_ADDREF(*_retval = printSettings); // ref count michael@0: michael@0: nsXPIDLString printerName; michael@0: nsresult rv = GetDefaultPrinterName(getter_Copies(printerName)); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: (*_retval)->SetPrinterName(printerName.get()); michael@0: michael@0: (void)InitPrintSettingsFromPrefs(*_retval, false, michael@0: nsIPrintSettings::kInitSaveAll); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsPrintOptions::CreatePrintSettings(nsIPrintSettings **_retval) michael@0: { michael@0: return _CreatePrintSettings(_retval); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::GetGlobalPrintSettings(nsIPrintSettings **aGlobalPrintSettings) michael@0: { michael@0: nsresult rv; michael@0: michael@0: rv = CreatePrintSettings(getter_AddRefs(mGlobalPrintSettings)); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: NS_ADDREF(*aGlobalPrintSettings = mGlobalPrintSettings.get()); michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::GetNewPrintSettings(nsIPrintSettings * *aNewPrintSettings) michael@0: { michael@0: return CreatePrintSettings(aNewPrintSettings); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::GetDefaultPrinterName(char16_t * *aDefaultPrinterName) michael@0: { michael@0: nsresult rv; michael@0: nsCOMPtr prtEnum = michael@0: do_GetService(NS_PRINTER_ENUMERATOR_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: // Look up the printer from the last print job michael@0: nsAutoString lastPrinterName; michael@0: Preferences::GetString(kPrinterName, &lastPrinterName); michael@0: if (!lastPrinterName.IsEmpty()) { michael@0: // Verify it's still a valid printer michael@0: nsCOMPtr printers; michael@0: rv = prtEnum->GetPrinterNameList(getter_AddRefs(printers)); michael@0: if (NS_SUCCEEDED(rv)) { michael@0: bool isValid = false; michael@0: bool hasMore; michael@0: while (NS_SUCCEEDED(printers->HasMore(&hasMore)) && hasMore) { michael@0: nsAutoString printer; michael@0: if (NS_SUCCEEDED(printers->GetNext(printer)) && lastPrinterName.Equals(printer)) { michael@0: isValid = true; michael@0: break; michael@0: } michael@0: } michael@0: if (isValid) { michael@0: *aDefaultPrinterName = ToNewUnicode(lastPrinterName); michael@0: return NS_OK; michael@0: } michael@0: } michael@0: } michael@0: michael@0: // There is no last printer preference, or it doesn't name a valid printer. michael@0: // Return the default from the printer enumeration. michael@0: return prtEnum->GetDefaultPrinterName(aDefaultPrinterName); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::InitPrintSettingsFromPrinter(const char16_t *aPrinterName, michael@0: nsIPrintSettings *aPrintSettings) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPrintSettings); michael@0: NS_ENSURE_ARG_POINTER(aPrinterName); michael@0: michael@0: #ifdef DEBUG michael@0: nsXPIDLString printerName; michael@0: aPrintSettings->GetPrinterName(getter_Copies(printerName)); michael@0: if (!printerName.Equals(aPrinterName)) { michael@0: NS_WARNING("Printer names should match!"); michael@0: } michael@0: #endif michael@0: michael@0: bool isInitialized; michael@0: aPrintSettings->GetIsInitializedFromPrinter(&isInitialized); michael@0: if (isInitialized) michael@0: return NS_OK; michael@0: michael@0: nsresult rv; michael@0: nsCOMPtr prtEnum = michael@0: do_GetService(NS_PRINTER_ENUMERATOR_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = prtEnum->InitPrintSettingsFromPrinter(aPrinterName, aPrintSettings); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: aPrintSettings->SetIsInitializedFromPrinter(true); michael@0: return rv; michael@0: } michael@0: michael@0: /** --------------------------------------------------- michael@0: * Helper function - Returns either the name or sets the length to zero michael@0: */ michael@0: static nsresult michael@0: GetAdjustedPrinterName(nsIPrintSettings* aPS, bool aUsePNP, michael@0: nsAString& aPrinterName) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPS); michael@0: michael@0: aPrinterName.Truncate(); michael@0: if (!aUsePNP) michael@0: return NS_OK; michael@0: michael@0: // Get the Printer Name from the PrintSettings michael@0: // to use as a prefix for Pref Names michael@0: char16_t* prtName = nullptr; michael@0: michael@0: nsresult rv = aPS->GetPrinterName(&prtName); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: aPrinterName = nsDependentString(prtName); michael@0: michael@0: // Convert any whitespaces, carriage returns or newlines to _ michael@0: // The below algorithm is supposedly faster than using iterators michael@0: NS_NAMED_LITERAL_STRING(replSubstr, "_"); michael@0: const char* replaceStr = " \n\r"; michael@0: michael@0: int32_t x; michael@0: for (x=0; x < (int32_t)strlen(replaceStr); x++) { michael@0: char16_t uChar = replaceStr[x]; michael@0: michael@0: int32_t i = 0; michael@0: while ((i = aPrinterName.FindChar(uChar, i)) != kNotFound) { michael@0: aPrinterName.Replace(i, 1, replSubstr); michael@0: i++; michael@0: } michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::GetPrinterPrefInt(nsIPrintSettings *aPrintSettings, michael@0: const char16_t *aPrefName, int32_t *_retval) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPrintSettings); michael@0: NS_ENSURE_ARG_POINTER(aPrefName); michael@0: michael@0: nsAutoString prtName; michael@0: // Get the Printer Name from the PrintSettings michael@0: // to use as a prefix for Pref Names michael@0: GetAdjustedPrinterName(aPrintSettings, true, prtName); michael@0: michael@0: const char* prefName = michael@0: GetPrefName(NS_LossyConvertUTF16toASCII(aPrefName).get(), prtName); michael@0: michael@0: NS_ENSURE_TRUE(prefName, NS_ERROR_FAILURE); michael@0: michael@0: int32_t iVal; michael@0: nsresult rv = Preferences::GetInt(prefName, &iVal); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: *_retval = iVal; michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsPrintOptions::InitPrintSettingsFromPrefs(nsIPrintSettings* aPS, michael@0: bool aUsePNP, uint32_t aFlags) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPS); michael@0: michael@0: bool isInitialized; michael@0: aPS->GetIsInitializedFromPrefs(&isInitialized); michael@0: michael@0: if (isInitialized) michael@0: return NS_OK; michael@0: michael@0: nsAutoString prtName; michael@0: // read any non printer specific prefs michael@0: // with empty printer name michael@0: nsresult rv = ReadPrefs(aPS, prtName, aFlags); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: // Do not use printer name in Linux because GTK backend does not support michael@0: // per printer settings. michael@0: #ifndef MOZ_X11 michael@0: // Get the Printer Name from the PrintSettings michael@0: // to use as a prefix for Pref Names michael@0: rv = GetAdjustedPrinterName(aPS, aUsePNP, prtName); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: if (prtName.IsEmpty()) { michael@0: NS_WARNING("Caller should supply a printer name."); michael@0: return NS_OK; michael@0: } michael@0: michael@0: // Now read any printer specific prefs michael@0: rv = ReadPrefs(aPS, prtName, aFlags); michael@0: if (NS_SUCCEEDED(rv)) michael@0: aPS->SetIsInitializedFromPrefs(true); michael@0: #endif michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /** michael@0: * Save all of the printer settings; if we can find a printer name, save michael@0: * printer-specific preferences. Otherwise, save generic ones. michael@0: */ michael@0: nsresult michael@0: nsPrintOptions::SavePrintSettingsToPrefs(nsIPrintSettings *aPS, michael@0: bool aUsePrinterNamePrefix, michael@0: uint32_t aFlags) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPS); michael@0: nsAutoString prtName; michael@0: michael@0: // Do not use printer name in Linux because GTK backend does not support michael@0: // per printer settings. michael@0: #ifndef MOZ_X11 michael@0: // Get the printer name from the PrinterSettings for an optional prefix. michael@0: nsresult rv = GetAdjustedPrinterName(aPS, aUsePrinterNamePrefix, prtName); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: #endif michael@0: michael@0: // Write the prefs, with or without a printer name prefix. michael@0: return WritePrefs(aPS, prtName, aFlags); michael@0: } michael@0: michael@0: michael@0: //----------------------------------------------------- michael@0: //-- Protected Methods -------------------------------- michael@0: //----------------------------------------------------- michael@0: nsresult michael@0: nsPrintOptions::ReadPrefDouble(const char * aPrefId, double& aVal) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPrefId); michael@0: michael@0: nsAutoCString str; michael@0: nsresult rv = Preferences::GetCString(aPrefId, &str); michael@0: if (NS_SUCCEEDED(rv) && !str.IsEmpty()) { michael@0: aVal = atof(str.get()); michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: nsresult michael@0: nsPrintOptions::WritePrefDouble(const char * aPrefId, double aVal) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPrefId); michael@0: michael@0: nsPrintfCString str("%6.2f", aVal); michael@0: NS_ENSURE_TRUE(!str.IsEmpty(), NS_ERROR_FAILURE); michael@0: michael@0: return Preferences::SetCString(aPrefId, str); michael@0: } michael@0: michael@0: void michael@0: nsPrintOptions::ReadInchesToTwipsPref(const char * aPrefId, int32_t& aTwips, michael@0: const char * aMarginPref) michael@0: { michael@0: nsAutoString str; michael@0: nsresult rv = Preferences::GetString(aPrefId, &str); michael@0: if (NS_FAILED(rv) || str.IsEmpty()) { michael@0: rv = Preferences::GetString(aMarginPref, &str); michael@0: } michael@0: if (NS_SUCCEEDED(rv) && !str.IsEmpty()) { michael@0: nsresult errCode; michael@0: float inches = str.ToFloat(&errCode); michael@0: if (NS_SUCCEEDED(errCode)) { michael@0: aTwips = NS_INCHES_TO_INT_TWIPS(inches); michael@0: } else { michael@0: aTwips = 0; michael@0: } michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsPrintOptions::WriteInchesFromTwipsPref(const char * aPrefId, int32_t aTwips) michael@0: { michael@0: double inches = NS_TWIPS_TO_INCHES(aTwips); michael@0: nsAutoCString inchesStr; michael@0: inchesStr.AppendFloat(inches); michael@0: michael@0: Preferences::SetCString(aPrefId, inchesStr); michael@0: } michael@0: michael@0: void michael@0: nsPrintOptions::ReadInchesIntToTwipsPref(const char * aPrefId, int32_t& aTwips, michael@0: const char * aMarginPref) michael@0: { michael@0: int32_t value; michael@0: nsresult rv = Preferences::GetInt(aPrefId, &value); michael@0: if (NS_FAILED(rv)) { michael@0: rv = Preferences::GetInt(aMarginPref, &value); michael@0: } michael@0: if (NS_SUCCEEDED(rv)) { michael@0: aTwips = NS_INCHES_TO_INT_TWIPS(float(value)/100.0f); michael@0: } else { michael@0: aTwips = 0; michael@0: } michael@0: } michael@0: michael@0: void michael@0: nsPrintOptions::WriteInchesIntFromTwipsPref(const char * aPrefId, int32_t aTwips) michael@0: { michael@0: Preferences::SetInt(aPrefId, michael@0: int32_t(NS_TWIPS_TO_INCHES(aTwips) * 100.0f + 0.5f)); michael@0: } michael@0: michael@0: void michael@0: nsPrintOptions::ReadJustification(const char * aPrefId, int16_t& aJust, michael@0: int16_t aInitValue) michael@0: { michael@0: aJust = aInitValue; michael@0: nsAutoString justStr; michael@0: if (NS_SUCCEEDED(Preferences::GetString(aPrefId, &justStr))) { michael@0: if (justStr.EqualsASCII(kJustRight)) { michael@0: aJust = nsIPrintSettings::kJustRight; michael@0: } else if (justStr.EqualsASCII(kJustCenter)) { michael@0: aJust = nsIPrintSettings::kJustCenter; michael@0: } else { michael@0: aJust = nsIPrintSettings::kJustLeft; michael@0: } michael@0: } michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: void michael@0: nsPrintOptions::WriteJustification(const char * aPrefId, int16_t aJust) michael@0: { michael@0: switch (aJust) { michael@0: case nsIPrintSettings::kJustLeft: michael@0: Preferences::SetCString(aPrefId, kJustLeft); michael@0: break; michael@0: michael@0: case nsIPrintSettings::kJustCenter: michael@0: Preferences::SetCString(aPrefId, kJustCenter); michael@0: break; michael@0: michael@0: case nsIPrintSettings::kJustRight: michael@0: Preferences::SetCString(aPrefId, kJustRight); michael@0: break; michael@0: } //switch michael@0: } michael@0: michael@0: //---------------------------------------------------------------------- michael@0: // Testing of read/write prefs michael@0: // This define turns on the testing module below michael@0: // so at start up it writes and reads the prefs. michael@0: #ifdef DEBUG_rods_X michael@0: class Tester { michael@0: public: michael@0: Tester(); michael@0: }; michael@0: Tester::Tester() michael@0: { michael@0: nsCOMPtr ps; michael@0: nsresult rv; michael@0: nsCOMPtr printService = michael@0: do_GetService("@mozilla.org/gfx/printsettings-service;1", &rv); michael@0: if (NS_SUCCEEDED(rv)) { michael@0: rv = printService->CreatePrintSettings(getter_AddRefs(ps)); michael@0: } michael@0: michael@0: if (ps) { michael@0: ps->SetPrintOptions(nsIPrintSettings::kPrintOddPages, true); michael@0: ps->SetPrintOptions(nsIPrintSettings::kPrintEvenPages, false); michael@0: ps->SetMarginTop(1.0); michael@0: ps->SetMarginLeft(1.0); michael@0: ps->SetMarginBottom(1.0); michael@0: ps->SetMarginRight(1.0); michael@0: ps->SetScaling(0.5); michael@0: ps->SetPrintBGColors(true); michael@0: ps->SetPrintBGImages(true); michael@0: ps->SetPrintRange(15); michael@0: ps->SetHeaderStrLeft(NS_ConvertUTF8toUTF16("Left").get()); michael@0: ps->SetHeaderStrCenter(NS_ConvertUTF8toUTF16("Center").get()); michael@0: ps->SetHeaderStrRight(NS_ConvertUTF8toUTF16("Right").get()); michael@0: ps->SetFooterStrLeft(NS_ConvertUTF8toUTF16("Left").get()); michael@0: ps->SetFooterStrCenter(NS_ConvertUTF8toUTF16("Center").get()); michael@0: ps->SetFooterStrRight(NS_ConvertUTF8toUTF16("Right").get()); michael@0: ps->SetPaperName(NS_ConvertUTF8toUTF16("Paper Name").get()); michael@0: ps->SetPlexName(NS_ConvertUTF8toUTF16("Plex Name").get()); michael@0: ps->SetPaperSizeType(10); michael@0: ps->SetPaperData(1); michael@0: ps->SetPaperWidth(100.0); michael@0: ps->SetPaperHeight(50.0); michael@0: ps->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters); michael@0: ps->SetPrintReversed(true); michael@0: ps->SetPrintInColor(true); michael@0: ps->SetOrientation(nsIPrintSettings::kLandscapeOrientation); michael@0: ps->SetPrintCommand(NS_ConvertUTF8toUTF16("Command").get()); michael@0: ps->SetNumCopies(2); michael@0: ps->SetPrinterName(NS_ConvertUTF8toUTF16("Printer Name").get()); michael@0: ps->SetPrintToFile(true); michael@0: ps->SetToFileName(NS_ConvertUTF8toUTF16("File Name").get()); michael@0: ps->SetPrintPageDelay(1000); michael@0: ps->SetShrinkToFit(true); michael@0: michael@0: struct SettingsType { michael@0: const char* mName; michael@0: uint32_t mFlag; michael@0: }; michael@0: SettingsType gSettings[] = { michael@0: {"OddEven", nsIPrintSettings::kInitSaveOddEvenPages}, michael@0: {kPrintHeaderStrLeft, nsIPrintSettings::kInitSaveHeaderLeft}, michael@0: {kPrintHeaderStrCenter, nsIPrintSettings::kInitSaveHeaderCenter}, michael@0: {kPrintHeaderStrRight, nsIPrintSettings::kInitSaveHeaderRight}, michael@0: {kPrintFooterStrLeft, nsIPrintSettings::kInitSaveFooterLeft}, michael@0: {kPrintFooterStrCenter, nsIPrintSettings::kInitSaveFooterCenter}, michael@0: {kPrintFooterStrRight, nsIPrintSettings::kInitSaveFooterRight}, michael@0: {kPrintBGColors, nsIPrintSettings::kInitSaveBGColors}, michael@0: {kPrintBGImages, nsIPrintSettings::kInitSaveBGImages}, michael@0: {kPrintShrinkToFit, nsIPrintSettings::kInitSaveShrinkToFit}, michael@0: {kPrintPaperSize, nsIPrintSettings::kInitSavePaperSize}, michael@0: {kPrintPlexName, nsIPrintSettings::kInitSavePlexName}, michael@0: {kPrintPaperData, nsIPrintSettings::kInitSavePaperData}, michael@0: {kPrintReversed, nsIPrintSettings::kInitSaveReversed}, michael@0: {kPrintInColor, nsIPrintSettings::kInitSaveInColor}, michael@0: {kPrintColorspace, nsIPrintSettings::kInitSaveColorspace}, michael@0: {kPrintResolutionName, nsIPrintSettings::kInitSaveResolutionName}, michael@0: {kPrintDownloadFonts, nsIPrintSettings::kInitSaveDownloadFonts}, michael@0: {kPrintOrientation, nsIPrintSettings::kInitSaveOrientation}, michael@0: {kPrintCommand, nsIPrintSettings::kInitSavePrintCommand}, michael@0: {kPrinterName, nsIPrintSettings::kInitSavePrinterName}, michael@0: {kPrintToFile, nsIPrintSettings::kInitSavePrintToFile}, michael@0: {kPrintToFileName, nsIPrintSettings::kInitSaveToFileName}, michael@0: {kPrintPageDelay, nsIPrintSettings::kInitSavePageDelay}, michael@0: {"Margins", nsIPrintSettings::kInitSaveMargins}, michael@0: {"All", nsIPrintSettings::kInitSaveAll}, michael@0: {nullptr, 0}}; michael@0: michael@0: nsString prefix; prefix.AssignLiteral("Printer Name"); michael@0: int32_t i = 0; michael@0: while (gSettings[i].mName != nullptr) { michael@0: printf("------------------------------------------------\n"); michael@0: printf("%d) %s -> 0x%X\n", i, gSettings[i].mName, gSettings[i].mFlag); michael@0: printService->SavePrintSettingsToPrefs(ps, true, gSettings[i].mFlag); michael@0: printService->InitPrintSettingsFromPrefs(ps, true, michael@0: gSettings[i].mFlag); michael@0: i++; michael@0: } michael@0: } michael@0: michael@0: } michael@0: Tester gTester; michael@0: #endif