[tor-commits] [tor-browser/esr24] Backed out changeset 810977d38c0d (bug 701479) for jetpack orange, DONTBUILD because strict backout and RyanVM says so.

mikeperry at torproject.org mikeperry at torproject.org
Fri Aug 29 05:26:44 UTC 2014


commit c523f5c0036542fc1ed36b78e46b99f1f86c8728
Author: Gijs Kruitbosch <gijskruitbosch at gmail.com>
Date:   Tue Jul 15 14:46:52 2014 +0100

    Backed out changeset 810977d38c0d (bug 701479) for jetpack orange, DONTBUILD because strict backout and RyanVM says so.
---
 widget/windows/nsDeviceContextSpecWin.cpp |  196 +++++++++++++++++++++++++++++
 1 file changed, 196 insertions(+)

diff --git a/widget/windows/nsDeviceContextSpecWin.cpp b/widget/windows/nsDeviceContextSpecWin.cpp
index 1da105f..134d74f 100644
--- a/widget/windows/nsDeviceContextSpecWin.cpp
+++ b/widget/windows/nsDeviceContextSpecWin.cpp
@@ -181,6 +181,189 @@ static PRUnichar * GetDefaultPrinterNameFromGlobalPrinters()
   return ToNewUnicode(printerName);
 }
 
+//----------------------------------------------------------------
+static nsresult 
+EnumerateNativePrinters(DWORD aWhichPrinters, LPWSTR aPrinterName, bool& aIsFound, bool& aIsFile)
+{
+  DWORD             dwSizeNeeded = 0;
+  DWORD             dwNumItems   = 0;
+  LPPRINTER_INFO_2W  lpInfo        = NULL;
+
+  // Get buffer size
+  if (::EnumPrintersW(aWhichPrinters, NULL, 2, NULL, 0, &dwSizeNeeded,
+                      &dwNumItems)) {
+    return NS_ERROR_FAILURE;
+  }
+
+  // allocate memory
+  lpInfo = (LPPRINTER_INFO_2W) malloc(dwSizeNeeded);
+  if (!lpInfo) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  if (::EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)lpInfo,
+                      dwSizeNeeded, &dwSizeNeeded, &dwNumItems) == 0) {
+    free(lpInfo);
+    return NS_OK;
+  }
+
+  for (DWORD i = 0; i < dwNumItems; i++ ) {
+    if (wcscmp(lpInfo[i].pPrinterName, aPrinterName) == 0) {
+      aIsFound = true;
+      aIsFile  = wcscmp(lpInfo[i].pPortName, L"FILE:") == 0;
+      break;
+    }
+  }
+
+  free(lpInfo);
+  return NS_OK;
+}
+
+//----------------------------------------------------------------
+static void 
+CheckForPrintToFileWithName(LPWSTR aPrinterName, bool& aIsFile)
+{
+  bool isFound = false;
+  aIsFile = false;
+  nsresult rv = EnumerateNativePrinters(PRINTER_ENUM_LOCAL, aPrinterName, isFound, aIsFile);
+  if (isFound) return;
+
+  rv = EnumerateNativePrinters(PRINTER_ENUM_NETWORK, aPrinterName, isFound, aIsFile);
+  if (isFound) return;
+
+  rv = EnumerateNativePrinters(PRINTER_ENUM_SHARED, aPrinterName, isFound, aIsFile);
+  if (isFound) return;
+
+  rv = EnumerateNativePrinters(PRINTER_ENUM_REMOTE, aPrinterName, isFound, aIsFile);
+  if (isFound) return;
+}
+
+static nsresult 
+GetFileNameForPrintSettings(nsIPrintSettings* aPS)
+{
+  // for testing
+#ifdef DEBUG_rods
+  return NS_OK;
+#endif
+
+  nsresult rv;
+
+  nsCOMPtr<nsIFilePicker> filePicker = do_CreateInstance("@mozilla.org/filepicker;1", &rv);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  nsCOMPtr<nsIStringBundleService> bundleService =
+    mozilla::services::GetStringBundleService();
+  if (!bundleService)
+    return NS_ERROR_FAILURE;
+  nsCOMPtr<nsIStringBundle> bundle;
+  rv = bundleService->CreateBundle(NS_ERROR_GFX_PRINTER_BUNDLE_URL, getter_AddRefs(bundle));
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  nsXPIDLString title;
+  rv = bundle->GetStringFromName(NS_LITERAL_STRING("PrintToFile").get(), getter_Copies(title));
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  nsCOMPtr<nsIWindowWatcher> wwatch =
+    (do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv));
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  nsCOMPtr<nsIDOMWindow> window;
+  wwatch->GetActiveWindow(getter_AddRefs(window));
+
+  rv = filePicker->Init(window, title, nsIFilePicker::modeSave);
+  NS_ENSURE_SUCCESS(rv, rv);
+ 
+  rv = filePicker->AppendFilters(nsIFilePicker::filterAll);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  PRUnichar* fileName;
+  aPS->GetToFileName(&fileName);
+
+  if (fileName) {
+    if (*fileName) {
+      nsAutoString leafName;
+      nsCOMPtr<nsIFile> file(do_CreateInstance("@mozilla.org/file/local;1"));
+      if (file) {
+        rv = file->InitWithPath(nsDependentString(fileName));
+        if (NS_SUCCEEDED(rv)) {
+          file->GetLeafName(leafName);
+          filePicker->SetDisplayDirectory(file);
+        }
+      }
+      if (!leafName.IsEmpty()) {
+        rv = filePicker->SetDefaultString(leafName);
+      }
+      NS_ENSURE_SUCCESS(rv, rv);
+    }
+    nsMemory::Free(fileName);
+  }
+
+  int16_t dialogResult;
+  filePicker->Show(&dialogResult);
+
+  if (dialogResult == nsIFilePicker::returnCancel) {
+    return NS_ERROR_ABORT;
+  }
+
+  nsCOMPtr<nsIFile> localFile;
+  rv = filePicker->GetFile(getter_AddRefs(localFile));
+  NS_ENSURE_SUCCESS(rv, rv);
+  
+  if (dialogResult == nsIFilePicker::returnReplace) {
+    // be extra safe and only delete when the file is really a file
+    bool isFile;
+    rv = localFile->IsFile(&isFile);
+    if (NS_SUCCEEDED(rv) && isFile) {
+      rv = localFile->Remove(false /* recursive delete */);
+      NS_ENSURE_SUCCESS(rv, rv);
+    }
+  }
+
+  nsAutoString unicodePath;
+  rv = localFile->GetPath(unicodePath);
+  NS_ENSURE_SUCCESS(rv,rv);
+
+  if (unicodePath.IsEmpty()) {
+    rv = NS_ERROR_ABORT;
+  }
+
+  if (NS_SUCCEEDED(rv)) aPS->SetToFileName(unicodePath.get());
+
+  return rv;
+}
+
+//----------------------------------------------------------------------------------
+static nsresult
+CheckForPrintToFile(nsIPrintSettings* aPS, LPWSTR aPrinterName, PRUnichar* aUPrinterName)
+{
+  nsresult rv = NS_OK;
+
+  if (!aPrinterName && !aUPrinterName) return rv;
+
+  bool toFile;
+  CheckForPrintToFileWithName(aPrinterName?aPrinterName:aUPrinterName, toFile);
+  // Since the driver wasn't a "Print To File" Driver, check to see
+  // if the name of the file has been set to the special "FILE:"
+  if (!toFile) {
+    nsXPIDLString toFileName;
+    aPS->GetToFileName(getter_Copies(toFileName));
+    if (toFileName) {
+      if (*toFileName) {
+        if (toFileName.EqualsLiteral("FILE:")) {
+          // this skips the setting of the "print to file" info below
+          // which we don't want to do.
+          return NS_OK; 
+        }
+      }
+    }
+  }
+  aPS->SetPrintToFile(toFile);
+  if (toFile) {
+    rv = GetFileNameForPrintSettings(aPS);
+  }
+  return rv;
+}
+
 //----------------------------------------------------------------------------------
 NS_IMETHODIMP nsDeviceContextSpecWin::Init(nsIWidget* aWidget,
                                            nsIPrintSettings* aPrintSettings,
@@ -215,6 +398,15 @@ NS_IMETHODIMP nsDeviceContextSpecWin::Init(nsIWidget* aWidget,
         SetDriverName(driverName);
         SetDevMode(devMode);
 
+        if (!aIsPrintPreview) {
+          rv = CheckForPrintToFile(mPrintSettings, deviceName, nullptr);
+          if (NS_FAILED(rv)) {
+            nsCRT::free(deviceName);
+            nsCRT::free(driverName);
+            return NS_ERROR_FAILURE;
+          }
+        }
+
         // clean up
         nsCRT::free(deviceName);
         nsCRT::free(driverName);
@@ -245,6 +437,10 @@ NS_IMETHODIMP nsDeviceContextSpecWin::Init(nsIWidget* aWidget,
   NS_ASSERTION(printerName, "We have to have a printer name");
   if (!printerName || !*printerName) return rv;
 
+  if (!aIsPrintPreview) {
+    CheckForPrintToFile(mPrintSettings, nullptr, printerName);
+  }
+ 
   return GetDataFromPrinter(printerName, mPrintSettings);
 }
 





More information about the tor-commits mailing list