From 75481a7c4d3b557da326c058d7b2d12958f8f018 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Tue, 18 Aug 2009 10:08:37 +0000 Subject: Convert EvDocument interface into an abstract class --- (limited to 'libdocument') 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; \ -- cgit v0.9.1