Bug 1090448 - Add GTK-specific PrintData fields and serialization / deserialization. r=karlt.

This commit is contained in:
Mike Conley 2015-03-05 11:17:18 -05:00
parent 7f2c899657
commit b250d71ce7
4 changed files with 65 additions and 6 deletions

View File

@ -6,6 +6,11 @@
namespace mozilla {
namespace embedding {
struct CStringKeyValue {
nsCString key;
nsCString value;
};
struct PrintData {
int32_t startPageRange;
int32_t endPageRange;
@ -76,7 +81,17 @@ struct PrintData {
bool isIFrameSelected;
bool isRangeSelection;
/* TODO: OS X specific things - specifically, an array of names for the
/**
* GTK-specific things. Some of these might look like dupes of the
* information we're already passing, but the generalized settings that
* we hold in nsIPrintSettings don't map perfectly to GTK's GtkPrintSettings,
* so there are some nuances. GtkPrintSettings, for example, stores both an
* internal name for paper size, as well as the display name.
*/
CStringKeyValue[] GTKPrintSettings;
/**
* TODO: OS X specific things - specifically, an array of names for the
* document to be supplied by nsIWebBrowserPrint::enumerateDocumentNames
*/
};

View File

@ -2,6 +2,7 @@
/* 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/. */
#include "nsPrintOptionsGTK.h"
#include "nsPrintSettingsGTK.h"
@ -24,6 +25,18 @@ nsPrintOptionsGTK::~nsPrintOptionsGTK()
{
}
static void
serialize_gtk_printsettings_to_printdata(const gchar *key,
const gchar *value,
gpointer aData)
{
PrintData* data = (PrintData*)aData;
CStringKeyValue pair;
pair.key() = key;
pair.value() = value;
data->GTKPrintSettings().AppendElement(pair);
}
NS_IMETHODIMP
nsPrintOptionsGTK::SerializeToPrintData(nsIPrintSettings* aSettings,
nsIWebBrowserPrint* aWBP,
@ -32,6 +45,17 @@ nsPrintOptionsGTK::SerializeToPrintData(nsIPrintSettings* aSettings,
nsresult rv = nsPrintOptions::SerializeToPrintData(aSettings, aWBP, data);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsPrintSettingsGTK> settingsGTK(do_QueryInterface(aSettings));
NS_ENSURE_STATE(settingsGTK);
GtkPrintSettings* gtkPrintSettings = settingsGTK->GetGtkPrintSettings();
NS_ENSURE_STATE(gtkPrintSettings);
gtk_print_settings_foreach(
gtkPrintSettings,
serialize_gtk_printsettings_to_printdata,
data);
return NS_OK;
}
@ -39,9 +63,29 @@ NS_IMETHODIMP
nsPrintOptionsGTK::DeserializeToPrintSettings(const PrintData& data,
nsIPrintSettings* settings)
{
nsCOMPtr<nsPrintSettingsGTK> settingsGTK(do_QueryInterface(settings));
NS_ENSURE_STATE(settingsGTK);
nsresult rv = nsPrintOptions::DeserializeToPrintSettings(data, settings);
NS_ENSURE_SUCCESS(rv, rv);
// Instead of re-using the GtkPrintSettings that nsIPrintSettings is
// wrapping, we'll create a new one to deserialize to and replace it
// within nsIPrintSettings.
GtkPrintSettings* newGtkPrintSettings = gtk_print_settings_new();
for (uint32_t i = 0; i < data.GTKPrintSettings().Length(); ++i) {
CStringKeyValue pair = data.GTKPrintSettings()[i];
gtk_print_settings_set(newGtkPrintSettings,
pair.key().get(),
pair.value().get());
}
settingsGTK->SetGtkPrintSettings(newGtkPrintSettings);
// nsPrintSettingsGTK is holding a reference to newGtkPrintSettings
g_object_unref(newGtkPrintSettings);
newGtkPrintSettings = nullptr;
return NS_OK;
}
@ -57,4 +101,3 @@ nsresult nsPrintOptionsGTK::_CreatePrintSettings(nsIPrintSettings **_retval)
return NS_OK;
}

View File

@ -33,7 +33,6 @@ public:
nsIPrintSettings* settings);
virtual nsresult _CreatePrintSettings(nsIPrintSettings **_retval);
};

View File

@ -758,9 +758,11 @@ nsPrintSettingsGTK::SetResolution(int32_t aResolution)
NS_IMETHODIMP
nsPrintSettingsGTK::GetDuplex(int32_t *aDuplex)
{
if (!gtk_print_settings_has_key(mPrintSettings, GTK_PRINT_SETTINGS_DUPLEX))
return NS_ERROR_FAILURE;
*aDuplex = gtk_print_settings_get_duplex(mPrintSettings);
if (!gtk_print_settings_has_key(mPrintSettings, GTK_PRINT_SETTINGS_DUPLEX)) {
*aDuplex = GTK_PRINT_DUPLEX_SIMPLEX;
} else {
*aDuplex = gtk_print_settings_get_duplex(mPrintSettings);
}
return NS_OK;
}