summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2011-11-23 09:25:10 +0100
committerDavid Tardon <dtardon@redhat.com>2011-12-05 15:11:47 +0100
commitd723e7b119fa9a4377e80f2e21ce728ed8603188 (patch)
tree5ba64aa2750ee2405560b8ef64dbe633b4568cfe /vcl
parent49721e5df83d025ca7b2e57f688900387235a786 (diff)
avoid memory leak when print has been cancelled
Diffstat (limited to 'vcl')
-rw-r--r--vcl/unx/gtk/gdi/salprn-gtk.cxx43
1 files changed, 33 insertions, 10 deletions
diff --git a/vcl/unx/gtk/gdi/salprn-gtk.cxx b/vcl/unx/gtk/gdi/salprn-gtk.cxx
index c34ada060a54..c4371765d498 100644
--- a/vcl/unx/gtk/gdi/salprn-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salprn-gtk.cxx
@@ -126,12 +126,36 @@ struct GtkSalPrinter_Impl
rtl::OUString m_sJobName;
GtkPrinter* m_pPrinter;
GtkPrintSettings* m_pSettings;
+
+ GtkSalPrinter_Impl();
+ ~GtkSalPrinter_Impl();
};
+GtkSalPrinter_Impl::GtkSalPrinter_Impl()
+ : m_pPrinter(0)
+ , m_pSettings(0)
+{
+}
+
+
+GtkSalPrinter_Impl::~GtkSalPrinter_Impl()
+{
+ if (m_pPrinter)
+ {
+ g_object_unref(G_OBJECT(m_pPrinter));
+ m_pPrinter = NULL;
+ }
+ if (m_pSettings)
+ {
+ g_object_unref(G_OBJECT(m_pSettings));
+ m_pSettings = NULL;
+ }
+}
+
+
GtkSalPrinter::GtkSalPrinter(SalInfoPrinter* const i_pInfoPrinter)
: PspSalPrinter(i_pInfoPrinter)
- , m_pImpl(new GtkSalPrinter_Impl())
{
}
@@ -179,15 +203,13 @@ GtkSalPrinter::StartJob(
ImplJobSetup* io_pSetupData,
vcl::PrinterController& io_rController)
{
+ OSL_PRECOND(!m_pImpl, "there is a job running already");
+
if (!vcl::useSystemPrintDialog())
- {
return impl_doJob(i_pFileName, i_rJobName, i_rAppName, io_pSetupData, 1, false, io_rController);
- }
- m_pImpl->m_sSpoolFile = rtl::OString();
+ m_pImpl.reset(new GtkSalPrinter_Impl());
m_pImpl->m_sJobName = i_rJobName;
- m_pImpl->m_pPrinter = NULL;
- m_pImpl->m_pSettings = NULL;
rtl::OString sFileName;
if (i_pFileName)
@@ -235,12 +257,13 @@ GtkSalPrinter::StartJob(
sal_Bool
GtkSalPrinter::EndJob()
{
+ OSL_PRECOND(m_pImpl, "there is no job running");
sal_Bool bRet = PspSalPrinter::EndJob();
if (!vcl::useSystemPrintDialog())
return bRet;
- if (!bRet || m_pImpl->m_sSpoolFile.isEmpty())
+ if (!bRet || !m_pImpl || m_pImpl->m_sSpoolFile.isEmpty())
return bRet;
GtkPageSetup* pPageSetup = gtk_page_setup_new();
@@ -270,8 +293,7 @@ GtkSalPrinter::EndJob()
}
g_object_unref(pPageSetup);
- g_object_unref(m_pImpl->m_pSettings);
- g_object_unref(m_pImpl->m_pPrinter);
+ m_pImpl.reset();
//To-Do, remove temp spool file
@@ -949,7 +971,8 @@ GtkPrintDialog::updateControllerPrintRange()
}
}
}
- }
+ }
+ g_object_unref(G_OBJECT(pSettings));
}