[evince] Convert EvDocument interface into an abstract class



commit 75481a7c4d3b557da326c058d7b2d12958f8f018
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Tue Aug 18 12:08:37 2009 +0200

    Convert EvDocument interface into an abstract class

 backend/comics/comics-document.c     |   36 +++++++--------
 backend/djvu/djvu-document-private.h |    2 +-
 backend/djvu/djvu-document.c         |   42 ++++++++----------
 backend/dvi/dvi-document.c           |   43 ++++++++----------
 backend/impress/impress-document.c   |   46 +++++++++-----------
 backend/pdf/ev-poppler.cc            |   80 ++++++++++++++++------------------
 backend/pixbuf/pixbuf-document.c     |   32 ++++++--------
 backend/ps/ev-spectre.c              |   38 +++++++---------
 backend/tiff/tiff-document.c         |   64 +++++++++++++--------------
 libdocument/ev-document.c            |   75 +++++++++++++++-----------------
 libdocument/ev-document.h            |   43 ++++++++++--------
 11 files changed, 232 insertions(+), 269 deletions(-)
---
diff --git a/backend/comics/comics-document.c b/backend/comics/comics-document.c
index 0c3d37f..3cd6db6 100644
--- a/backend/comics/comics-document.c
+++ b/backend/comics/comics-document.c
@@ -36,10 +36,10 @@
 
 struct _ComicsDocumentClass
 {
-	GObjectClass parent_class;
+	EvDocumentClass parent_class;
 };
- 
-typedef enum 
+
+typedef enum
 {
 	RARLABS,
 	GNAUNRAR,
@@ -49,7 +49,8 @@ typedef enum
 
 struct _ComicsDocument
 {
-	GObject parent_instance;
+	EvDocument parent_instance;
+
 	gchar    *archive, *dir;
 	GSList   *page_names;
 	gint     n_pages;
@@ -80,7 +81,6 @@ struct {
 
 typedef struct    _ComicsDocumentClass ComicsDocumentClass;
 
-static void       comics_document_document_iface_init (EvDocumentIface *iface);
 static void       comics_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
 
 static GSList*    get_supported_image_extensions (void);
@@ -721,13 +721,6 @@ comics_document_finalize (GObject *object)
 	G_OBJECT_CLASS (comics_document_parent_class)->finalize (object);
 }
 
-static void
-comics_document_class_init (ComicsDocumentClass *klass)
-{
-	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-	gobject_class->finalize = comics_document_finalize;
-}
-
 static EvDocumentInfo *
 comics_document_get_info (EvDocument *document)
 {
@@ -737,14 +730,19 @@ comics_document_get_info (EvDocument *document)
 }
 
 static void
-comics_document_document_iface_init (EvDocumentIface *iface)
+comics_document_class_init (ComicsDocumentClass *klass)
 {
-	iface->load = comics_document_load;
-	iface->save = comics_document_save;
-	iface->get_n_pages = comics_document_get_n_pages;
-	iface->get_page_size = comics_document_get_page_size;
-	iface->render = comics_document_render;
-	iface->get_info = comics_document_get_info;
+	GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+	EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
+
+	gobject_class->finalize = comics_document_finalize;
+
+	ev_document_class->load = comics_document_load;
+	ev_document_class->save = comics_document_save;
+	ev_document_class->get_n_pages = comics_document_get_n_pages;
+	ev_document_class->get_page_size = comics_document_get_page_size;
+	ev_document_class->render = comics_document_render;
+	ev_document_class->get_info = comics_document_get_info;
 }
 
 static void
diff --git a/backend/djvu/djvu-document-private.h b/backend/djvu/djvu-document-private.h
index a110e15..d1d7ec7 100644
--- a/backend/djvu/djvu-document-private.h
+++ b/backend/djvu/djvu-document-private.h
@@ -26,7 +26,7 @@
 #include <libdjvu/ddjvuapi.h>
 
 struct _DjvuDocument {
-	GObject           parent_instance;
+	EvDocument        parent_instance;
 
 	ddjvu_context_t  *d_context;
 	ddjvu_document_t *d_document;
diff --git a/backend/djvu/djvu-document.c b/backend/djvu/djvu-document.c
index daf09a5..2bc1f7e 100644
--- a/backend/djvu/djvu-document.c
+++ b/backend/djvu/djvu-document.c
@@ -46,12 +46,11 @@ enum {
 
 struct _DjvuDocumentClass
 {
-	GObjectClass parent_class;
+	EvDocumentClass parent_class;
 };
 
 typedef struct _DjvuDocumentClass DjvuDocumentClass;
 
-static void djvu_document_document_iface_init (EvDocumentIface *iface);
 static void djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
 static void djvu_document_file_exporter_iface_init (EvFileExporterIface *iface);
 static void djvu_document_find_iface_init (EvDocumentFindIface *iface);
@@ -387,6 +386,16 @@ djvu_document_render (EvDocument      *document,
 	return surface;
 }
 
+static EvDocumentInfo *
+djvu_document_get_info (EvDocument *document)
+{
+	EvDocumentInfo *info;
+
+	info = g_new0 (EvDocumentInfo, 1);
+
+	return info;
+}
+
 static void
 djvu_document_finalize (GObject *object)
 {
@@ -412,30 +421,17 @@ djvu_document_finalize (GObject *object)
 static void
 djvu_document_class_init (DjvuDocumentClass *klass)
 {
-	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+	GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+	EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
 
 	gobject_class->finalize = djvu_document_finalize;
-}
 
-static EvDocumentInfo *
-djvu_document_get_info (EvDocument *document)
-{
-	EvDocumentInfo *info;
-
-	info = g_new0 (EvDocumentInfo, 1);
-
-	return info;
-}
-
-static void
-djvu_document_document_iface_init (EvDocumentIface *iface)
-{
-	iface->load = djvu_document_load;
-	iface->save = djvu_document_save;
-	iface->get_n_pages = djvu_document_get_n_pages;
-	iface->get_page_size = djvu_document_get_page_size;
-	iface->render = djvu_document_render;
-	iface->get_info = djvu_document_get_info;
+	ev_document_class->load = djvu_document_load;
+	ev_document_class->save = djvu_document_save;
+	ev_document_class->get_n_pages = djvu_document_get_n_pages;
+	ev_document_class->get_page_size = djvu_document_get_page_size;
+	ev_document_class->render = djvu_document_render;
+	ev_document_class->get_info = djvu_document_get_info;
 }
 
 static gchar *
diff --git a/backend/dvi/dvi-document.c b/backend/dvi/dvi-document.c
index a1097c9..7551f80 100644
--- a/backend/dvi/dvi-document.c
+++ b/backend/dvi/dvi-document.c
@@ -44,12 +44,12 @@ enum {
 
 struct _DviDocumentClass
 {
-	GObjectClass parent_class;
+	EvDocumentClass parent_class;
 };
 
 struct _DviDocument
 {
-	GObject parent_instance;
+	EvDocument parent_instance;
 
 	DviContext *context;
 	DviPageSpec *spec;
@@ -68,7 +68,6 @@ struct _DviDocument
 
 typedef struct _DviDocumentClass DviDocumentClass;
 
-static void dvi_document_document_iface_init            (EvDocumentIface           *iface);
 static void dvi_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
 static void dvi_document_file_exporter_iface_init	(EvFileExporterIface 	   *iface);
 static void dvi_document_do_color_special               (DviContext                *dvi,
@@ -230,11 +229,21 @@ dvi_document_finalize (GObject *object)
 	G_OBJECT_CLASS (dvi_document_parent_class)->finalize (object);
 }
 
+static EvDocumentInfo *
+dvi_document_get_info (EvDocument *document)
+{
+	EvDocumentInfo *info;
+
+	info = g_new0 (EvDocumentInfo, 1);
+
+	return info;
+}
 
 static void
 dvi_document_class_init (DviDocumentClass *klass)
 {
-	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+	GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+	EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
 
 	gobject_class->finalize = dvi_document_finalize;
 
@@ -243,27 +252,13 @@ dvi_document_class_init (DviDocumentClass *klass)
 	mdvi_register_fonts ();
 
 	dvi_context_mutex = g_mutex_new ();
-}
-
-static EvDocumentInfo *
-dvi_document_get_info (EvDocument *document)
-{
-	EvDocumentInfo *info;
-
-	info = g_new0 (EvDocumentInfo, 1);
 
-	return info;
-}
-
-static void
-dvi_document_document_iface_init (EvDocumentIface *iface)
-{
-	iface->load = dvi_document_load;
-	iface->save = dvi_document_save;
-	iface->get_n_pages = dvi_document_get_n_pages;
-	iface->get_page_size = dvi_document_get_page_size;
-	iface->render = dvi_document_render;
-	iface->get_info = dvi_document_get_info;
+	ev_document_class->load = dvi_document_load;
+	ev_document_class->save = dvi_document_save;
+	ev_document_class->get_n_pages = dvi_document_get_n_pages;
+	ev_document_class->get_page_size = dvi_document_get_page_size;
+	ev_document_class->render = dvi_document_render;
+	ev_document_class->get_info = dvi_document_get_info;
 }
 
 static void
diff --git a/backend/impress/impress-document.c b/backend/impress/impress-document.c
index 72eb8c1..0d58aaf 100644
--- a/backend/impress/impress-document.c
+++ b/backend/impress/impress-document.c
@@ -33,12 +33,12 @@
 
 struct _ImpressDocumentClass
 {
-  GObjectClass parent_class;
+  EvDocumentClass parent_class;
 };
 
 struct _ImpressDocument
 {
-  GObject parent_instance;
+  EvDocument parent_instance;
 
   ImpDoc *imp;
   ImpRenderCtx *ctx;
@@ -59,7 +59,6 @@ struct _ImpressDocument
 
 typedef struct _ImpressDocumentClass ImpressDocumentClass;
 
-static void impress_document_document_iface_init (EvDocumentIface *iface);
 static void impress_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
 
 EV_BACKEND_REGISTER_WITH_CODE (ImpressDocument, impress_document,
@@ -425,6 +424,17 @@ impress_document_render (EvDocument      *document,
   return scaled_surface;
 }
 
+static EvDocumentInfo *
+impress_document_get_info (EvDocument *document)
+{
+  EvDocumentInfo *info;
+
+  info = g_new0 (EvDocumentInfo, 1);
+  info->fields_mask = 0;
+
+  return info;
+}
+
 static void
 impress_document_finalize (GObject *object)
 {
@@ -454,31 +464,17 @@ impress_document_finalize (GObject *object)
 static void
 impress_document_class_init (ImpressDocumentClass *klass)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+  EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
 
   gobject_class->finalize = impress_document_finalize;
-}
 
-static EvDocumentInfo *
-impress_document_get_info (EvDocument *document)
-{
-  EvDocumentInfo *info;
-
-  info = g_new0 (EvDocumentInfo, 1);
-  info->fields_mask = 0;
-
-  return info;
-}
-
-static void
-impress_document_document_iface_init (EvDocumentIface *iface)
-{
-  iface->load = impress_document_load;
-  iface->save = impress_document_save;
-  iface->get_n_pages = impress_document_get_n_pages;
-  iface->get_page_size = impress_document_get_page_size;
-  iface->render = impress_document_render;
-  iface->get_info = impress_document_get_info;
+  ev_document_class->load = impress_document_load;
+  ev_document_class->save = impress_document_save;
+  ev_document_class->get_n_pages = impress_document_get_n_pages;
+  ev_document_class->get_page_size = impress_document_get_page_size;
+  ev_document_class->render = impress_document_render;
+  ev_document_class->get_info = impress_document_get_info;
 }
 
 static GdkPixbuf *
diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc
index 0333d71..84314ce 100644
--- a/backend/pdf/ev-poppler.cc
+++ b/backend/pdf/ev-poppler.cc
@@ -92,12 +92,12 @@ typedef struct {
 
 struct _PdfDocumentClass
 {
-	GObjectClass parent_class;
+	EvDocumentClass parent_class;
 };
 
 struct _PdfDocument
 {
-	GObject parent_instance;
+	EvDocument parent_instance;
 
 	PopplerDocument *document;
 	gchar *password;
@@ -113,7 +113,6 @@ struct _PdfDocument
 	GList *layers;
 };
 
-static void pdf_document_document_iface_init             (EvDocumentIface            *iface);
 static void pdf_document_security_iface_init             (EvDocumentSecurityIface    *iface);
 static void pdf_document_document_thumbnails_iface_init  (EvDocumentThumbnailsIface  *iface);
 static void pdf_document_document_links_iface_init       (EvDocumentLinksIface       *iface);
@@ -234,14 +233,6 @@ pdf_document_dispose (GObject *object)
 }
 
 static void
-pdf_document_class_init (PdfDocumentClass *klass)
-{
-	GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
-
-	g_object_class->dispose = pdf_document_dispose;
-}
-
-static void
 pdf_document_init (PdfDocument *pdf_document)
 {
 	pdf_document->password = NULL;
@@ -448,28 +439,6 @@ pdf_document_render (EvDocument      *document,
 				width, height, rc);
 }
 
-/* EvDocumentSecurity */
-
-static gboolean
-pdf_document_has_document_security (EvDocumentSecurity *document_security)
-{
-	/* FIXME: do we really need to have this? */
-	return FALSE;
-}
-
-static void
-pdf_document_set_password (EvDocumentSecurity *document_security,
-			   const char         *password)
-{
-	PdfDocument *document = PDF_DOCUMENT (document_security);
-
-	if (document->password)
-		g_free (document->password);
-
-	document->password = g_strdup (password);
-}
-
-
 /* reference:
 http://www.pdfa.org/lib/exe/fetch.php?id=pdfa%3Aen%3Atechdoc&cache=cache&media=pdfa:techdoc:tn0001_pdfa-1_and_namespaces_2008-03-18.pdf */
 static char *
@@ -721,17 +690,42 @@ pdf_document_get_info (EvDocument *document)
 }
 
 static void
-pdf_document_document_iface_init (EvDocumentIface *iface)
-{
-	iface->save = pdf_document_save;
-	iface->load = pdf_document_load;
-	iface->get_n_pages = pdf_document_get_n_pages;
-	iface->get_page = pdf_document_get_page;
-	iface->get_page_size = pdf_document_get_page_size;
-	iface->get_page_label = pdf_document_get_page_label;
-	iface->render = pdf_document_render;
-	iface->get_info = pdf_document_get_info;
-};
+pdf_document_class_init (PdfDocumentClass *klass)
+{
+	GObjectClass    *g_object_class = G_OBJECT_CLASS (klass);
+	EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
+
+	g_object_class->dispose = pdf_document_dispose;
+
+	ev_document_class->save = pdf_document_save;
+	ev_document_class->load = pdf_document_load;
+	ev_document_class->get_n_pages = pdf_document_get_n_pages;
+	ev_document_class->get_page = pdf_document_get_page;
+	ev_document_class->get_page_size = pdf_document_get_page_size;
+	ev_document_class->get_page_label = pdf_document_get_page_label;
+	ev_document_class->render = pdf_document_render;
+	ev_document_class->get_info = pdf_document_get_info;
+}
+
+/* EvDocumentSecurity */
+static gboolean
+pdf_document_has_document_security (EvDocumentSecurity *document_security)
+{
+	/* FIXME: do we really need to have this? */
+	return FALSE;
+}
+
+static void
+pdf_document_set_password (EvDocumentSecurity *document_security,
+			   const char         *password)
+{
+	PdfDocument *document = PDF_DOCUMENT (document_security);
+
+	if (document->password)
+		g_free (document->password);
+
+	document->password = g_strdup (password);
+}
 
 static void
 pdf_document_security_iface_init (EvDocumentSecurityIface *iface)
diff --git a/backend/pixbuf/pixbuf-document.c b/backend/pixbuf/pixbuf-document.c
index d509b4d..df3af03 100644
--- a/backend/pixbuf/pixbuf-document.c
+++ b/backend/pixbuf/pixbuf-document.c
@@ -27,12 +27,12 @@
 
 struct _PixbufDocumentClass
 {
-	GObjectClass parent_class;
+	EvDocumentClass parent_class;
 };
 
 struct _PixbufDocument
 {
-	GObject parent_instance;
+	EvDocument parent_instance;
 
 	GdkPixbuf *pixbuf;
 	
@@ -41,7 +41,6 @@ struct _PixbufDocument
 
 typedef struct _PixbufDocumentClass PixbufDocumentClass;
 
-static void pixbuf_document_document_iface_init (EvDocumentIface *iface);
 static void pixbuf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
 
 EV_BACKEND_REGISTER_WITH_CODE (PixbufDocument, pixbuf_document,
@@ -139,14 +138,6 @@ pixbuf_document_finalize (GObject *object)
 	G_OBJECT_CLASS (pixbuf_document_parent_class)->finalize (object);
 }
 
-static void
-pixbuf_document_class_init (PixbufDocumentClass *klass)
-{
-	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
-	gobject_class->finalize = pixbuf_document_finalize;
-}
-
 static EvDocumentInfo *
 pixbuf_document_get_info (EvDocument *document)
 {
@@ -159,14 +150,19 @@ pixbuf_document_get_info (EvDocument *document)
 }
 
 static void
-pixbuf_document_document_iface_init (EvDocumentIface *iface)
+pixbuf_document_class_init (PixbufDocumentClass *klass)
 {
-	iface->load = pixbuf_document_load;
-	iface->save = pixbuf_document_save;
-	iface->get_n_pages = pixbuf_document_get_n_pages;
-	iface->get_page_size = pixbuf_document_get_page_size;
-	iface->render = pixbuf_document_render;
-	iface->get_info = pixbuf_document_get_info;
+	GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+	EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
+
+	gobject_class->finalize = pixbuf_document_finalize;
+
+	ev_document_class->load = pixbuf_document_load;
+	ev_document_class->save = pixbuf_document_save;
+	ev_document_class->get_n_pages = pixbuf_document_get_n_pages;
+	ev_document_class->get_page_size = pixbuf_document_get_page_size;
+	ev_document_class->render = pixbuf_document_render;
+	ev_document_class->get_info = pixbuf_document_get_info;
 }
 
 static GdkPixbuf *
diff --git a/backend/ps/ev-spectre.c b/backend/ps/ev-spectre.c
index 1342c3e..8ee1732 100644
--- a/backend/ps/ev-spectre.c
+++ b/backend/ps/ev-spectre.c
@@ -31,17 +31,16 @@
 #include "ev-document-misc.h"
 
 struct _PSDocument {
-	GObject object;
+	EvDocument object;
 
 	SpectreDocument *doc;
 	SpectreExporter *exporter;
 };
 
 struct _PSDocumentClass {
-	GObjectClass parent_class;
+	EvDocumentClass parent_class;
 };
 
-static void ps_document_document_iface_init            (EvDocumentIface           *iface);
 static void ps_document_file_exporter_iface_init       (EvFileExporterIface       *iface);
 static void ps_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
 
@@ -77,16 +76,6 @@ ps_document_dispose (GObject *object)
 	G_OBJECT_CLASS (ps_document_parent_class)->dispose (object);
 }
 
-static void
-ps_document_class_init (PSDocumentClass *klass)
-{
-	GObjectClass *object_class;
-
-	object_class = G_OBJECT_CLASS (klass);
-
-	object_class->dispose = ps_document_dispose;
-}
-
 /* EvDocumentIface */
 static gboolean
 ps_document_load (EvDocument *document,
@@ -331,16 +320,21 @@ ps_document_render (EvDocument      *document,
 }
 
 static void
-ps_document_document_iface_init (EvDocumentIface *iface)
+ps_document_class_init (PSDocumentClass *klass)
 {
-	iface->load = ps_document_load;
-	iface->save = ps_document_save;
-	iface->get_n_pages = ps_document_get_n_pages;
-	iface->get_page = ps_document_get_page;
-	iface->get_page_size = ps_document_get_page_size;
-	iface->get_page_label = ps_document_get_page_label;
-	iface->get_info = ps_document_get_info;
-	iface->render = ps_document_render;
+	GObjectClass    *object_class = G_OBJECT_CLASS (klass);
+	EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
+
+	object_class->dispose = ps_document_dispose;
+
+	ev_document_class->load = ps_document_load;
+	ev_document_class->save = ps_document_save;
+	ev_document_class->get_n_pages = ps_document_get_n_pages;
+	ev_document_class->get_page = ps_document_get_page;
+	ev_document_class->get_page_size = ps_document_get_page_size;
+	ev_document_class->get_page_label = ps_document_get_page_label;
+	ev_document_class->get_info = ps_document_get_info;
+	ev_document_class->render = ps_document_render;
 }
 
 /* EvDocumentThumbnailsIface */
diff --git a/backend/tiff/tiff-document.c b/backend/tiff/tiff-document.c
index 7f10c9a..d122ba7 100644
--- a/backend/tiff/tiff-document.c
+++ b/backend/tiff/tiff-document.c
@@ -37,12 +37,12 @@
 
 struct _TiffDocumentClass
 {
-  GObjectClass parent_class;
+  EvDocumentClass parent_class;
 };
 
 struct _TiffDocument
 {
-  GObject parent_instance;
+  EvDocument parent_instance;
 
   TIFF *tiff;
   gint n_pages;
@@ -53,7 +53,6 @@ struct _TiffDocument
 
 typedef struct _TiffDocumentClass TiffDocumentClass;
 
-static void tiff_document_document_iface_init (EvDocumentIface *iface);
 static void tiff_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
 static void tiff_document_document_file_exporter_iface_init (EvFileExporterIface *iface);
 
@@ -384,39 +383,18 @@ tiff_document_render_pixbuf (EvDocument      *document,
 	return rotated_pixbuf;
 }
 
-static void
-tiff_document_finalize (GObject *object)
-{
-	TiffDocument *tiff_document = TIFF_DOCUMENT (object);
-
-	if (tiff_document->tiff)
-		TIFFClose (tiff_document->tiff);
-	if (tiff_document->uri)
-		g_free (tiff_document->uri);
-
-	G_OBJECT_CLASS (tiff_document_parent_class)->finalize (object);
-}
-
-static void
-tiff_document_class_init (TiffDocumentClass *klass)
-{
-	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
-	gobject_class->finalize = tiff_document_finalize;
-}
-
 static gchar *
 tiff_document_get_page_label (EvDocument *document,
 			      EvPage     *page)
 {
 	TiffDocument *tiff_document = TIFF_DOCUMENT (document);
 	static gchar *label;
-	
+
 	if (TIFFGetField (tiff_document->tiff, TIFFTAG_PAGENAME, &label) &&
 	    g_utf8_validate (label, -1, NULL)) {
 		return g_strdup (label);
 	}
-	
+
 	return NULL;
 }
 
@@ -432,15 +410,33 @@ tiff_document_get_info (EvDocument *document)
 }
 
 static void
-tiff_document_document_iface_init (EvDocumentIface *iface)
+tiff_document_finalize (GObject *object)
+{
+	TiffDocument *tiff_document = TIFF_DOCUMENT (object);
+
+	if (tiff_document->tiff)
+		TIFFClose (tiff_document->tiff);
+	if (tiff_document->uri)
+		g_free (tiff_document->uri);
+
+	G_OBJECT_CLASS (tiff_document_parent_class)->finalize (object);
+}
+
+static void
+tiff_document_class_init (TiffDocumentClass *klass)
 {
-	iface->load = tiff_document_load;
-	iface->save = tiff_document_save;
-	iface->get_n_pages = tiff_document_get_n_pages;
-	iface->get_page_size = tiff_document_get_page_size;
-	iface->render = tiff_document_render;
-	iface->get_page_label = tiff_document_get_page_label;
-	iface->get_info = tiff_document_get_info;
+	GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+	EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
+
+	gobject_class->finalize = tiff_document_finalize;
+
+	ev_document_class->load = tiff_document_load;
+	ev_document_class->save = tiff_document_save;
+	ev_document_class->get_n_pages = tiff_document_get_n_pages;
+	ev_document_class->get_page_size = tiff_document_get_page_size;
+	ev_document_class->render = tiff_document_render;
+	ev_document_class->get_page_label = tiff_document_get_page_label;
+	ev_document_class->get_info = tiff_document_get_info;
 }
 
 static GdkPixbuf *
diff --git a/libdocument/ev-document.c b/libdocument/ev-document.c
index 9d1144a..66d7d46 100644
--- a/libdocument/ev-document.c
+++ b/libdocument/ev-document.c
@@ -1,5 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
 /*
+ *  Copyright (C) 2009 Carlos Garcia Campos
  *  Copyright (C) 2004 Marco Pesenti Gritti
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -25,7 +26,7 @@
 GMutex *ev_doc_mutex = NULL;
 GMutex *ev_fc_mutex = NULL;
 
-EV_DEFINE_INTERFACE (EvDocument, ev_document, G_TYPE_OBJECT)
+G_DEFINE_ABSTRACT_TYPE (EvDocument, ev_document, G_TYPE_OBJECT)
 
 GQuark
 ev_document_error_quark (void)
@@ -37,11 +38,24 @@ ev_document_error_quark (void)
   return q;
 }
 
+static EvPage *
+ev_document_impl_get_page (EvDocument *document,
+			   gint        index)
+{
+	return ev_page_new (index);
+}
+
 static void
-ev_document_class_init (EvDocumentIface *klass)
+ev_document_init (EvDocument *document)
 {
 }
 
+static void
+ev_document_class_init (EvDocumentClass *klass)
+{
+	klass->get_page = ev_document_impl_get_page;
+}
+
 GMutex *
 ev_document_get_doc_mutex (void)
 {
@@ -118,16 +132,16 @@ ev_document_load (EvDocument  *document,
 		  const char  *uri,
 		  GError     **error)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 	gboolean retval;
 	GError *err = NULL;
 
-	retval = iface->load (document, uri, &err);
+	retval = klass->load (document, uri, &err);
 	if (!retval) {
 		if (err) {
 			g_propagate_error (error, err);
 		} else {
-			g_warning ("%s::EvDocumentIface::load returned FALSE but did not fill in @error; fix the backend!\n",
+			g_warning ("%s::EvDocument::load returned FALSE but did not fill in @error; fix the backend!\n",
 				   G_OBJECT_TYPE_NAME (document));
 
 			/* So upper layers don't crash */
@@ -156,38 +170,26 @@ ev_document_save (EvDocument  *document,
 		  const char  *uri,
 		  GError     **error)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-	gboolean retval;
-
-	retval = iface->save (document, uri, error);
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 
-	return retval;
+	return klass->save (document, uri, error);
 }
 
 int
 ev_document_get_n_pages (EvDocument  *document)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-	gint retval;
-
-	retval = iface->get_n_pages (document);
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 
-	return retval;
+	return klass->get_n_pages (document);
 }
 
 EvPage *
 ev_document_get_page (EvDocument *document,
 		      gint        index)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-	EvPage *retval;
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 
-	if (iface->get_page)
-		retval = iface->get_page (document, index);
-	else
-		retval = ev_page_new (index);
-
-	return retval;
+	return klass->get_page (document, index);
 }
 
 void
@@ -196,43 +198,36 @@ ev_document_get_page_size (EvDocument *document,
 			   double     *width,
 			   double     *height)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 
-	iface->get_page_size (document, page, width, height);
+	klass->get_page_size (document, page, width, height);
 }
 
-char *
+gchar *
 ev_document_get_page_label (EvDocument *document,
 			    EvPage     *page)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 
-	if (iface->get_page_label == NULL)
-		return NULL;
-
-	return iface->get_page_label (document, page);
+	return klass->get_page_label ?
+		klass->get_page_label (document, page) : NULL;
 }
 
 EvDocumentInfo *
 ev_document_get_info (EvDocument *document)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 
-	return iface->get_info (document);
+	return klass->get_info (document);
 }
 
 cairo_surface_t *
 ev_document_render (EvDocument      *document,
 		    EvRenderContext *rc)
 {
-	EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
-	cairo_surface_t *retval;
-
-	g_assert (iface->render);
+	EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document);
 
-	retval = iface->render (document, rc);
-
-	return retval;
+	return klass->render (document, rc);
 }
 
 /* EvDocumentInfo */
diff --git a/libdocument/ev-document.h b/libdocument/ev-document.h
index e74c49a..74bd3bb 100644
--- a/libdocument/ev-document.h
+++ b/libdocument/ev-document.h
@@ -1,5 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
 /*
+ *  Copyright (C) 2009 Carlos Garcia Campos
  *  Copyright (C) 2000-2003 Marco Pesenti Gritti
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -39,13 +40,13 @@ G_BEGIN_DECLS
 
 #define EV_TYPE_DOCUMENT            (ev_document_get_type ())
 #define EV_DOCUMENT(o)              (G_TYPE_CHECK_INSTANCE_CAST ((o), EV_TYPE_DOCUMENT, EvDocument))
-#define EV_DOCUMENT_IFACE(k)        (G_TYPE_CHECK_CLASS_CAST((k), EV_TYPE_DOCUMENT, EvDocumentIface))
+#define EV_DOCUMENT_CLASS(k)        (G_TYPE_CHECK_CLASS_CAST((k), EV_TYPE_DOCUMENT, EvDocumentClass))
 #define EV_IS_DOCUMENT(o)           (G_TYPE_CHECK_INSTANCE_TYPE ((o), EV_TYPE_DOCUMENT))
-#define EV_IS_DOCUMENT_IFACE(k)     (G_TYPE_CHECK_CLASS_TYPE ((k), EV_TYPE_DOCUMENT))
-#define EV_DOCUMENT_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), EV_TYPE_DOCUMENT, EvDocumentIface))
+#define EV_IS_DOCUMENT_CLASS(k)     (G_TYPE_CHECK_CLASS_TYPE ((k), EV_TYPE_DOCUMENT))
+#define EV_DOCUMENT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), EV_TYPE_DOCUMENT, EvDocumentClass))
 
 typedef struct _EvDocument        EvDocument;
-typedef struct _EvDocumentIface   EvDocumentIface;
+typedef struct _EvDocumentClass   EvDocumentClass;
 typedef struct _EvPageCache       EvPageCache;
 typedef struct _EvPageCacheClass  EvPageCacheClass;
 
@@ -66,29 +67,34 @@ typedef struct {
 
 typedef struct _EvRectangle EvRectangle;
 
-struct _EvDocumentIface
+struct _EvDocument
 {
-        GTypeInterface base_iface;
+	GObject base;
+};
+
+struct _EvDocumentClass
+{
+        GObjectClass base_class;
 
-        /* Methods  */
+        /* Virtual Methods  */
         gboolean          (* load)            (EvDocument      *document,
                                                const char      *uri,
                                                GError         **error);
         gboolean          (* save)            (EvDocument      *document,
                                                const char      *uri,
                                                GError         **error);
-        int               (* get_n_pages)     (EvDocument      *document);
+        gint              (* get_n_pages)     (EvDocument      *document);
 	EvPage          * (* get_page)        (EvDocument      *document,
 					       gint             index);
         void              (* get_page_size)   (EvDocument      *document,
                                                EvPage          *page,
                                                double          *width,
                                                double          *height);
-        char            * (* get_page_label)  (EvDocument      *document,
+        gchar           * (* get_page_label)  (EvDocument      *document,
                                                EvPage          *page);
         cairo_surface_t * (* render)          (EvDocument      *document,
                                                EvRenderContext *rc);
-        EvDocumentInfo *  (* get_info)        (EvDocument      *document);
+        EvDocumentInfo  * (* get_info)        (EvDocument      *document);
 };
 
 GType            ev_document_get_type         (void) G_GNUC_CONST;
@@ -113,14 +119,14 @@ gboolean         ev_document_load             (EvDocument      *document,
 gboolean         ev_document_save             (EvDocument      *document,
                                                const char      *uri,
                                                GError         **error);
-int              ev_document_get_n_pages      (EvDocument      *document);
+gint             ev_document_get_n_pages      (EvDocument      *document);
 EvPage          *ev_document_get_page         (EvDocument      *document,
 					       gint             index);
 void             ev_document_get_page_size    (EvDocument      *document,
                                                EvPage          *page,
                                                double          *width,
                                                double          *height);
-char            *ev_document_get_page_label   (EvDocument      *document,
+gchar           *ev_document_get_page_label   (EvDocument      *document,
                                                EvPage          *page);
 cairo_surface_t *ev_document_render           (EvDocument      *document,
                                                EvRenderContext *rc);
@@ -187,7 +193,7 @@ static void     backend_name##_class_intern_init (gpointer klass)		\
 G_MODULE_EXPORT GType								\
 register_evince_backend (GTypeModule *module)					\
 {										\
-	const GTypeInfo our_info = {  				        \
+	const GTypeInfo our_info = {  				                \
 		sizeof (BackendName##Class),					\
 		NULL, /* base_init */						\
 		NULL, /* base_finalize */					\
@@ -204,14 +210,11 @@ register_evince_backend (GTypeModule *module)					\
 	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");			\
                                                                                 \
 	g_define_type_id = g_type_module_register_type (module,		        \
-					    G_TYPE_OBJECT,			\
-					    #BackendName,			\
-					    &our_info,				\
-					   (GTypeFlags)0);	                \
+					                EV_TYPE_DOCUMENT,	\
+					                #BackendName,		\
+					                &our_info,		\
+					                (GTypeFlags)0);	        \
 							                        \
-	EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT,                       \
-                               backend_name##_document_iface_init);             \
-										\
 	CODE									\
 										\
 	return g_define_type_id;						\



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]