1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/widget/windows/nsPrintSettingsWin.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,237 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 +#include "nsPrintSettingsWin.h" 1.9 +#include "nsCRT.h" 1.10 + 1.11 +NS_IMPL_ISUPPORTS_INHERITED(nsPrintSettingsWin, 1.12 + nsPrintSettings, 1.13 + nsIPrintSettingsWin) 1.14 + 1.15 +/** --------------------------------------------------- 1.16 + * See documentation in nsPrintSettingsWin.h 1.17 + * @update 1.18 + */ 1.19 +nsPrintSettingsWin::nsPrintSettingsWin() : 1.20 + nsPrintSettings(), 1.21 + mDeviceName(nullptr), 1.22 + mDriverName(nullptr), 1.23 + mDevMode(nullptr) 1.24 +{ 1.25 + 1.26 +} 1.27 + 1.28 +/** --------------------------------------------------- 1.29 + * See documentation in nsPrintSettingsWin.h 1.30 + * @update 1.31 + */ 1.32 +nsPrintSettingsWin::nsPrintSettingsWin(const nsPrintSettingsWin& aPS) : 1.33 + mDeviceName(nullptr), 1.34 + mDriverName(nullptr), 1.35 + mDevMode(nullptr) 1.36 +{ 1.37 + *this = aPS; 1.38 +} 1.39 + 1.40 +/** --------------------------------------------------- 1.41 + * See documentation in nsPrintSettingsWin.h 1.42 + * @update 1.43 + */ 1.44 +nsPrintSettingsWin::~nsPrintSettingsWin() 1.45 +{ 1.46 + if (mDeviceName) nsMemory::Free(mDeviceName); 1.47 + if (mDriverName) nsMemory::Free(mDriverName); 1.48 + if (mDevMode) ::HeapFree(::GetProcessHeap(), 0, mDevMode); 1.49 +} 1.50 + 1.51 +/* [noscript] attribute charPtr deviceName; */ 1.52 +NS_IMETHODIMP nsPrintSettingsWin::SetDeviceName(const char16_t * aDeviceName) 1.53 +{ 1.54 + if (mDeviceName) { 1.55 + nsMemory::Free(mDeviceName); 1.56 + } 1.57 + mDeviceName = aDeviceName?wcsdup(char16ptr_t(aDeviceName)):nullptr; 1.58 + return NS_OK; 1.59 +} 1.60 +NS_IMETHODIMP nsPrintSettingsWin::GetDeviceName(char16_t **aDeviceName) 1.61 +{ 1.62 + NS_ENSURE_ARG_POINTER(aDeviceName); 1.63 + *aDeviceName = mDeviceName?reinterpret_cast<char16_t*>(wcsdup(mDeviceName)):nullptr; 1.64 + return NS_OK; 1.65 +} 1.66 + 1.67 +/* [noscript] attribute charPtr driverName; */ 1.68 +NS_IMETHODIMP nsPrintSettingsWin::SetDriverName(const char16_t * aDriverName) 1.69 +{ 1.70 + if (mDriverName) { 1.71 + nsMemory::Free(mDriverName); 1.72 + } 1.73 + mDriverName = aDriverName?wcsdup(char16ptr_t(aDriverName)):nullptr; 1.74 + return NS_OK; 1.75 +} 1.76 +NS_IMETHODIMP nsPrintSettingsWin::GetDriverName(char16_t **aDriverName) 1.77 +{ 1.78 + NS_ENSURE_ARG_POINTER(aDriverName); 1.79 + *aDriverName = mDriverName?reinterpret_cast<char16_t*>(wcsdup(mDriverName)):nullptr; 1.80 + return NS_OK; 1.81 +} 1.82 + 1.83 +void nsPrintSettingsWin::CopyDevMode(DEVMODEW* aInDevMode, DEVMODEW *& aOutDevMode) 1.84 +{ 1.85 + aOutDevMode = nullptr; 1.86 + size_t size = aInDevMode->dmSize + aInDevMode->dmDriverExtra; 1.87 + aOutDevMode = (LPDEVMODEW)::HeapAlloc (::GetProcessHeap(), HEAP_ZERO_MEMORY, size); 1.88 + if (aOutDevMode) { 1.89 + memcpy(aOutDevMode, aInDevMode, size); 1.90 + } 1.91 + 1.92 +} 1.93 + 1.94 +/* [noscript] attribute nsDevMode devMode; */ 1.95 +NS_IMETHODIMP nsPrintSettingsWin::GetDevMode(DEVMODEW * *aDevMode) 1.96 +{ 1.97 + NS_ENSURE_ARG_POINTER(aDevMode); 1.98 + 1.99 + if (mDevMode) { 1.100 + CopyDevMode(mDevMode, *aDevMode); 1.101 + } else { 1.102 + *aDevMode = nullptr; 1.103 + } 1.104 + return NS_OK; 1.105 +} 1.106 + 1.107 +NS_IMETHODIMP nsPrintSettingsWin::SetDevMode(DEVMODEW * aDevMode) 1.108 +{ 1.109 + if (mDevMode) { 1.110 + ::HeapFree(::GetProcessHeap(), 0, mDevMode); 1.111 + mDevMode = nullptr; 1.112 + } 1.113 + 1.114 + if (aDevMode) { 1.115 + CopyDevMode(aDevMode, mDevMode); 1.116 + } 1.117 + return NS_OK; 1.118 +} 1.119 + 1.120 +//------------------------------------------- 1.121 +nsresult 1.122 +nsPrintSettingsWin::_Clone(nsIPrintSettings **_retval) 1.123 +{ 1.124 + nsPrintSettingsWin* printSettings = new nsPrintSettingsWin(*this); 1.125 + return printSettings->QueryInterface(NS_GET_IID(nsIPrintSettings), (void**)_retval); // ref counts 1.126 +} 1.127 + 1.128 +//------------------------------------------- 1.129 +nsPrintSettingsWin& nsPrintSettingsWin::operator=(const nsPrintSettingsWin& rhs) 1.130 +{ 1.131 + if (this == &rhs) { 1.132 + return *this; 1.133 + } 1.134 + 1.135 + ((nsPrintSettings&) *this) = rhs; 1.136 + 1.137 + if (mDeviceName) { 1.138 + free(mDeviceName); 1.139 + } 1.140 + 1.141 + if (mDriverName) { 1.142 + free(mDriverName); 1.143 + } 1.144 + 1.145 + // Use free because we used the native malloc to create the memory 1.146 + if (mDevMode) { 1.147 + ::HeapFree(::GetProcessHeap(), 0, mDevMode); 1.148 + } 1.149 + 1.150 + mDeviceName = rhs.mDeviceName?wcsdup(rhs.mDeviceName):nullptr; 1.151 + mDriverName = rhs.mDriverName?wcsdup(rhs.mDriverName):nullptr; 1.152 + 1.153 + if (rhs.mDevMode) { 1.154 + CopyDevMode(rhs.mDevMode, mDevMode); 1.155 + } else { 1.156 + mDevMode = nullptr; 1.157 + } 1.158 + 1.159 + return *this; 1.160 +} 1.161 + 1.162 +//------------------------------------------- 1.163 +/* void assign (in nsIPrintSettings aPS); */ 1.164 +nsresult 1.165 +nsPrintSettingsWin::_Assign(nsIPrintSettings *aPS) 1.166 +{ 1.167 + nsPrintSettingsWin *psWin = static_cast<nsPrintSettingsWin*>(aPS); 1.168 + *this = *psWin; 1.169 + return NS_OK; 1.170 +} 1.171 + 1.172 +//---------------------------------------------------------------------- 1.173 +// Testing of assign and clone 1.174 +// This define turns on the testing module below 1.175 +// so at start up it writes and reads the prefs. 1.176 +#ifdef DEBUG_rodsX 1.177 +#include "nsIPrintOptions.h" 1.178 +#include "nsIServiceManager.h" 1.179 +class Tester { 1.180 +public: 1.181 + Tester(); 1.182 +}; 1.183 +Tester::Tester() 1.184 +{ 1.185 + nsCOMPtr<nsIPrintSettings> ps; 1.186 + nsresult rv; 1.187 + nsCOMPtr<nsIPrintOptions> printService = do_GetService("@mozilla.org/gfx/printsettings-service;1", &rv); 1.188 + if (NS_SUCCEEDED(rv)) { 1.189 + rv = printService->CreatePrintSettings(getter_AddRefs(ps)); 1.190 + } 1.191 + 1.192 + if (ps) { 1.193 + ps->SetPrintOptions(nsIPrintSettings::kPrintOddPages, true); 1.194 + ps->SetPrintOptions(nsIPrintSettings::kPrintEvenPages, false); 1.195 + ps->SetMarginTop(1.0); 1.196 + ps->SetMarginLeft(1.0); 1.197 + ps->SetMarginBottom(1.0); 1.198 + ps->SetMarginRight(1.0); 1.199 + ps->SetScaling(0.5); 1.200 + ps->SetPrintBGColors(true); 1.201 + ps->SetPrintBGImages(true); 1.202 + ps->SetPrintRange(15); 1.203 + ps->SetHeaderStrLeft(NS_ConvertUTF8toUTF16("Left").get()); 1.204 + ps->SetHeaderStrCenter(NS_ConvertUTF8toUTF16("Center").get()); 1.205 + ps->SetHeaderStrRight(NS_ConvertUTF8toUTF16("Right").get()); 1.206 + ps->SetFooterStrLeft(NS_ConvertUTF8toUTF16("Left").get()); 1.207 + ps->SetFooterStrCenter(NS_ConvertUTF8toUTF16("Center").get()); 1.208 + ps->SetFooterStrRight(NS_ConvertUTF8toUTF16("Right").get()); 1.209 + ps->SetPaperName(NS_ConvertUTF8toUTF16("Paper Name").get()); 1.210 + ps->SetPaperSizeType(10); 1.211 + ps->SetPaperData(1); 1.212 + ps->SetPaperWidth(100.0); 1.213 + ps->SetPaperHeight(50.0); 1.214 + ps->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters); 1.215 + ps->SetPrintReversed(true); 1.216 + ps->SetPrintInColor(true); 1.217 + ps->SetOrientation(nsIPrintSettings::kLandscapeOrientation); 1.218 + ps->SetPrintCommand(NS_ConvertUTF8toUTF16("Command").get()); 1.219 + ps->SetNumCopies(2); 1.220 + ps->SetPrinterName(NS_ConvertUTF8toUTF16("Printer Name").get()); 1.221 + ps->SetPrintToFile(true); 1.222 + ps->SetToFileName(NS_ConvertUTF8toUTF16("File Name").get()); 1.223 + ps->SetPrintPageDelay(1000); 1.224 + 1.225 + nsCOMPtr<nsIPrintSettings> ps2; 1.226 + if (NS_SUCCEEDED(rv)) { 1.227 + rv = printService->CreatePrintSettings(getter_AddRefs(ps2)); 1.228 + } 1.229 + 1.230 + ps2->Assign(ps); 1.231 + 1.232 + nsCOMPtr<nsIPrintSettings> psClone; 1.233 + ps2->Clone(getter_AddRefs(psClone)); 1.234 + 1.235 + } 1.236 + 1.237 +} 1.238 +Tester gTester; 1.239 +#endif 1.240 +