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: #include "nsPrintSettingsWin.h" michael@0: #include "nsCRT.h" michael@0: michael@0: NS_IMPL_ISUPPORTS_INHERITED(nsPrintSettingsWin, michael@0: nsPrintSettings, michael@0: nsIPrintSettingsWin) michael@0: michael@0: /** --------------------------------------------------- michael@0: * See documentation in nsPrintSettingsWin.h michael@0: * @update michael@0: */ michael@0: nsPrintSettingsWin::nsPrintSettingsWin() : michael@0: nsPrintSettings(), michael@0: mDeviceName(nullptr), michael@0: mDriverName(nullptr), michael@0: mDevMode(nullptr) michael@0: { michael@0: michael@0: } michael@0: michael@0: /** --------------------------------------------------- michael@0: * See documentation in nsPrintSettingsWin.h michael@0: * @update michael@0: */ michael@0: nsPrintSettingsWin::nsPrintSettingsWin(const nsPrintSettingsWin& aPS) : michael@0: mDeviceName(nullptr), michael@0: mDriverName(nullptr), michael@0: mDevMode(nullptr) michael@0: { michael@0: *this = aPS; michael@0: } michael@0: michael@0: /** --------------------------------------------------- michael@0: * See documentation in nsPrintSettingsWin.h michael@0: * @update michael@0: */ michael@0: nsPrintSettingsWin::~nsPrintSettingsWin() michael@0: { michael@0: if (mDeviceName) nsMemory::Free(mDeviceName); michael@0: if (mDriverName) nsMemory::Free(mDriverName); michael@0: if (mDevMode) ::HeapFree(::GetProcessHeap(), 0, mDevMode); michael@0: } michael@0: michael@0: /* [noscript] attribute charPtr deviceName; */ michael@0: NS_IMETHODIMP nsPrintSettingsWin::SetDeviceName(const char16_t * aDeviceName) michael@0: { michael@0: if (mDeviceName) { michael@0: nsMemory::Free(mDeviceName); michael@0: } michael@0: mDeviceName = aDeviceName?wcsdup(char16ptr_t(aDeviceName)):nullptr; michael@0: return NS_OK; michael@0: } michael@0: NS_IMETHODIMP nsPrintSettingsWin::GetDeviceName(char16_t **aDeviceName) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aDeviceName); michael@0: *aDeviceName = mDeviceName?reinterpret_cast(wcsdup(mDeviceName)):nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* [noscript] attribute charPtr driverName; */ michael@0: NS_IMETHODIMP nsPrintSettingsWin::SetDriverName(const char16_t * aDriverName) michael@0: { michael@0: if (mDriverName) { michael@0: nsMemory::Free(mDriverName); michael@0: } michael@0: mDriverName = aDriverName?wcsdup(char16ptr_t(aDriverName)):nullptr; michael@0: return NS_OK; michael@0: } michael@0: NS_IMETHODIMP nsPrintSettingsWin::GetDriverName(char16_t **aDriverName) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aDriverName); michael@0: *aDriverName = mDriverName?reinterpret_cast(wcsdup(mDriverName)):nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: void nsPrintSettingsWin::CopyDevMode(DEVMODEW* aInDevMode, DEVMODEW *& aOutDevMode) michael@0: { michael@0: aOutDevMode = nullptr; michael@0: size_t size = aInDevMode->dmSize + aInDevMode->dmDriverExtra; michael@0: aOutDevMode = (LPDEVMODEW)::HeapAlloc (::GetProcessHeap(), HEAP_ZERO_MEMORY, size); michael@0: if (aOutDevMode) { michael@0: memcpy(aOutDevMode, aInDevMode, size); michael@0: } michael@0: michael@0: } michael@0: michael@0: /* [noscript] attribute nsDevMode devMode; */ michael@0: NS_IMETHODIMP nsPrintSettingsWin::GetDevMode(DEVMODEW * *aDevMode) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aDevMode); michael@0: michael@0: if (mDevMode) { michael@0: CopyDevMode(mDevMode, *aDevMode); michael@0: } else { michael@0: *aDevMode = nullptr; michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsPrintSettingsWin::SetDevMode(DEVMODEW * aDevMode) michael@0: { michael@0: if (mDevMode) { michael@0: ::HeapFree(::GetProcessHeap(), 0, mDevMode); michael@0: mDevMode = nullptr; michael@0: } michael@0: michael@0: if (aDevMode) { michael@0: CopyDevMode(aDevMode, mDevMode); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: //------------------------------------------- michael@0: nsresult michael@0: nsPrintSettingsWin::_Clone(nsIPrintSettings **_retval) michael@0: { michael@0: nsPrintSettingsWin* printSettings = new nsPrintSettingsWin(*this); michael@0: return printSettings->QueryInterface(NS_GET_IID(nsIPrintSettings), (void**)_retval); // ref counts michael@0: } michael@0: michael@0: //------------------------------------------- michael@0: nsPrintSettingsWin& nsPrintSettingsWin::operator=(const nsPrintSettingsWin& rhs) michael@0: { michael@0: if (this == &rhs) { michael@0: return *this; michael@0: } michael@0: michael@0: ((nsPrintSettings&) *this) = rhs; michael@0: michael@0: if (mDeviceName) { michael@0: free(mDeviceName); michael@0: } michael@0: michael@0: if (mDriverName) { michael@0: free(mDriverName); michael@0: } michael@0: michael@0: // Use free because we used the native malloc to create the memory michael@0: if (mDevMode) { michael@0: ::HeapFree(::GetProcessHeap(), 0, mDevMode); michael@0: } michael@0: michael@0: mDeviceName = rhs.mDeviceName?wcsdup(rhs.mDeviceName):nullptr; michael@0: mDriverName = rhs.mDriverName?wcsdup(rhs.mDriverName):nullptr; michael@0: michael@0: if (rhs.mDevMode) { michael@0: CopyDevMode(rhs.mDevMode, mDevMode); michael@0: } else { michael@0: mDevMode = nullptr; michael@0: } michael@0: michael@0: return *this; michael@0: } michael@0: michael@0: //------------------------------------------- michael@0: /* void assign (in nsIPrintSettings aPS); */ michael@0: nsresult michael@0: nsPrintSettingsWin::_Assign(nsIPrintSettings *aPS) michael@0: { michael@0: nsPrintSettingsWin *psWin = static_cast(aPS); michael@0: *this = *psWin; michael@0: return NS_OK; michael@0: } michael@0: michael@0: //---------------------------------------------------------------------- michael@0: // Testing of assign and clone 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_rodsX michael@0: #include "nsIPrintOptions.h" michael@0: #include "nsIServiceManager.h" 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 = 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->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: michael@0: nsCOMPtr ps2; michael@0: if (NS_SUCCEEDED(rv)) { michael@0: rv = printService->CreatePrintSettings(getter_AddRefs(ps2)); michael@0: } michael@0: michael@0: ps2->Assign(ps); michael@0: michael@0: nsCOMPtr psClone; michael@0: ps2->Clone(getter_AddRefs(psClone)); michael@0: michael@0: } michael@0: michael@0: } michael@0: Tester gTester; michael@0: #endif michael@0: