[gcab] Use G_DECLARE_FINAL_TYPE to remove lots of C boilerplate



commit a265869aa1dfe2257f671b29f287211a90446061
Author: Richard Hughes <richard hughsie com>
Date:   Thu Dec 14 12:04:48 2017 +0000

    Use G_DECLARE_FINAL_TYPE to remove lots of C boilerplate
    
    This is a larger patch than I wanted, but various getters were required now the
    private structs are now sealed.

 libgcab/gcab-cabinet.c |   41 ++++++++++++++++++-----------------------
 libgcab/gcab-cabinet.h |   24 ++++++------------------
 libgcab/gcab-file.c    |   45 +++++++++++++++++++++++++++++++++++++++++++--
 libgcab/gcab-file.h    |   24 ++++++------------------
 libgcab/gcab-folder.c  |   38 ++++++++++++++++++++++++++------------
 libgcab/gcab-folder.h  |   16 ++--------------
 libgcab/gcab-priv.h    |   29 ++++++-----------------------
 7 files changed, 107 insertions(+), 110 deletions(-)
---
diff --git a/libgcab/gcab-cabinet.c b/libgcab/gcab-cabinet.c
index 2c015e3..b9a21f1 100644
--- a/libgcab/gcab-cabinet.c
+++ b/libgcab/gcab-cabinet.c
@@ -35,13 +35,7 @@
  * extracting and creation of archives.
  */
 
-struct _GCabCabinetClass
-{
-    GObjectClass parent_class;
-};
-
-struct _GCabCabinet
-{
+struct _GCabCabinet {
     GObject parent_instance;
 
     GPtrArray *folders;
@@ -242,7 +236,6 @@ gcab_cabinet_write (GCabCabinet *self,
     g_return_val_if_fail (self->folders->len == 1, FALSE);
 
     GCabFolder *cabfolder = g_ptr_array_index (self->folders, 0);
-    GCabFile *file;
     gsize nfiles = gcab_folder_get_nfiles (cabfolder);
     GInputStream *in = NULL;
     GDataOutputStream *dstream = NULL;
@@ -252,8 +245,8 @@ gcab_cabinet_write (GCabCabinet *self,
     guint8 data[DATABLOCKSIZE];
     gsize written;
     size_t sumstr = 0;
-    GSList *l, *files;
-    cfile_t *prevf = NULL;
+    GSList *files;
+    GCabFile *prevf = NULL;
 
     dstream = g_data_output_stream_new (out);
     g_data_output_stream_set_byte_order (dstream, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
@@ -268,10 +261,12 @@ gcab_cabinet_write (GCabCabinet *self,
     }
 
     files = gcab_folder_get_files (cabfolder);
-    for (l = files; l != NULL; l = l->next)
-        sumstr += strlen (GCAB_FILE (l->data)->name) + 1;
+    for (GSList *l = files; l != NULL; l = l->next) {
+        GCabFile *cabfile = GCAB_FILE (l->data);
+        sumstr += strlen (gcab_file_get_name (cabfile)) + 1;
+    }
 
-    folder.typecomp = cabfolder->comptype;
+    folder.typecomp = gcab_folder_get_comptype (cabfolder);
     folder.offsetdata = header.offsetfiles + nfiles * 16 + sumstr;
     folder.ndatab = gcab_folder_get_ndatablocks (cabfolder);
 
@@ -280,13 +275,13 @@ gcab_cabinet_write (GCabCabinet *self,
         if (!g_data_output_stream_put_byte (dstream, 0, cancellable, error))
             goto end;
 
-    for (l = files; l != NULL; l = l->next) {
-        file = GCAB_FILE (l->data);
+    for (GSList *l = files; l != NULL; l = l->next) {
+        GCabFile *file = GCAB_FILE (l->data);
         if (file_callback)
             file_callback (file, user_data);
 
         g_clear_object (&in);
-        in = G_INPUT_STREAM (g_file_read (file->file, cancellable, error));
+        in = G_INPUT_STREAM (g_file_read (gcab_file_get_gfile (file), cancellable, error));
         if (in == NULL)
             goto end;
 
@@ -324,16 +319,16 @@ gcab_cabinet_write (GCabCabinet *self,
     if (!cfolder_write (&folder, dstream, cancellable, error))
         goto end;
 
-    for (l = files; l != NULL; l = l->next) {
-        file = GCAB_FILE (l->data);
-        file->cfile.uoffset = prevf ? prevf->uoffset + prevf->usize : 0;
-        prevf = &file->cfile;
+    for (GSList *l = files; l != NULL; l = l->next) {
+        GCabFile *file = GCAB_FILE (l->data);
+        gcab_file_set_uoffset (file, prevf ? gcab_file_get_uoffset (prevf) + gcab_file_get_usize (prevf) : 
0);
+        prevf = file;
 
         /* automatically set flag if UTF-8 encoding */
-        if (!g_str_is_ascii (file->cfile.name))
-            file->cfile.fattr |= GCAB_FILE_ATTRIBUTE_NAME_IS_UTF;
+        if (!g_str_is_ascii (gcab_file_get_name (file)))
+            gcab_file_add_attribute (file, GCAB_FILE_ATTRIBUTE_NAME_IS_UTF);
 
-        if (!cfile_write (&file->cfile, dstream, cancellable, error))
+        if (!cfile_write (gcab_file_get_cfile (file), dstream, cancellable, error))
             goto end;
     }
 
diff --git a/libgcab/gcab-cabinet.h b/libgcab/gcab-cabinet.h
index e63763f..a880aa0 100644
--- a/libgcab/gcab-cabinet.h
+++ b/libgcab/gcab-cabinet.h
@@ -29,12 +29,13 @@
 
 G_BEGIN_DECLS
 
+/**
+ * GCabCabinet:
+ *
+ * An opaque object holding a Cabinet file reference.
+ **/
 #define GCAB_TYPE_CABINET                (gcab_cabinet_get_type ())
-#define GCAB_CABINET(cabinet)            (G_TYPE_CHECK_INSTANCE_CAST ((cabinet), GCAB_TYPE_CABINET, 
GCabCabinet))
-#define GCAB_CABINET_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), GCAB_TYPE_CABINET, 
GCabCabinetClass))
-#define GCAB_IS_CABINET(cabinet)         (G_TYPE_CHECK_INSTANCE_TYPE ((cabinet), GCAB_TYPE_CABINET))
-#define GCAB_IS_CABINET_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), GCAB_TYPE_CABINET))
-#define GCAB_CABINET_GET_CLASS(cabinet)  (G_TYPE_INSTANCE_GET_CLASS ((cabinet), GCAB_TYPE_CABINET, 
GCabCabinetClass))
+G_DECLARE_FINAL_TYPE(GCabCabinet, gcab_cabinet, GCAB, CABINET, GObject)
 
 /**
  * GCAB_ERROR:
@@ -58,17 +59,6 @@ typedef enum GCabError
     GCAB_ERROR_FAILED,
 } GCabError;
 
-typedef struct _GCabCabinetClass GCabCabinetClass;
-
-/**
- * GCabCabinet:
- *
- * An opaque object holding a Cabinet file reference.
- **/
-typedef struct _GCabCabinet GCabCabinet;
-
-GType gcab_cabinet_get_type (void) G_GNUC_CONST;
-
 GCabCabinet *      gcab_cabinet_new           (void);
 gboolean           gcab_cabinet_load          (GCabCabinet *cabinet,
                                                GInputStream *stream,
@@ -110,8 +100,6 @@ const GByteArray * gcab_cabinet_get_signature (GCabCabinet *cabinet,
                                                GCancellable *cancellable,
                                                GError **error);
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(GCabCabinet, g_object_unref)
-
 G_END_DECLS
 
 #endif /* _GCAB_CABINET_H_ */
diff --git a/libgcab/gcab-file.c b/libgcab/gcab-file.c
index 39284e4..72a6744 100644
--- a/libgcab/gcab-file.c
+++ b/libgcab/gcab-file.c
@@ -1,6 +1,7 @@
 /*
  * LibGCab
  * Copyright (c) 2012, Marc-André Lureau <marcandre lureau gmail com>
+ * Copyright (c) 2017, Richard Hughes <richard hughsie com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -38,9 +39,14 @@
  * must return a valid handle.
  */
 
-struct _GCabFileClass
+struct _GCabFile
 {
-    GObjectClass parent_class;
+    GObject parent_instance;
+
+    gchar *name;
+    gchar *extract_name;
+    GFile *file;
+    cfile_t cfile;
 };
 
 enum {
@@ -181,6 +187,41 @@ gcab_file_set_uoffset (GCabFile *self, guint32 uoffset)
     return TRUE;
 }
 
+G_GNUC_INTERNAL guint32
+gcab_file_get_uoffset (GCabFile *self)
+{
+    g_return_val_if_fail (GCAB_IS_FILE (self), 0);
+    return self->cfile.uoffset;
+}
+
+G_GNUC_INTERNAL guint32
+gcab_file_get_usize (GCabFile *self)
+{
+    g_return_val_if_fail (GCAB_IS_FILE (self), 0);
+    return self->cfile.usize;
+}
+
+G_GNUC_INTERNAL GFile *
+gcab_file_get_gfile (GCabFile *self)
+{
+    g_return_val_if_fail (GCAB_IS_FILE (self), NULL);
+    return self->file;
+}
+
+G_GNUC_INTERNAL void
+gcab_file_add_attribute (GCabFile *self, guint32 attribute)
+{
+    g_return_if_fail (GCAB_IS_FILE (self));
+    self->cfile.fattr |= attribute;
+}
+
+G_GNUC_INTERNAL cfile_t *
+gcab_file_get_cfile (GCabFile *self)
+{
+    g_return_val_if_fail (GCAB_IS_FILE (self), NULL);
+    return &self->cfile;
+}
+
 /**
  * gcab_file_get_size:
  * @file: a #GCabFile
diff --git a/libgcab/gcab-file.h b/libgcab/gcab-file.h
index b7579f4..60e59d1 100644
--- a/libgcab/gcab-file.h
+++ b/libgcab/gcab-file.h
@@ -26,14 +26,13 @@
 
 G_BEGIN_DECLS
 
+/**
+ * GCabFile:
+ *
+ * An opaque object, referencing a file in a Cabinet.
+ **/
 #define GCAB_TYPE_FILE             (gcab_file_get_type ())
-#define GCAB_FILE(file)            (G_TYPE_CHECK_INSTANCE_CAST ((file), GCAB_TYPE_FILE, GCabFile))
-#define GCAB_FILE_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GCAB_TYPE_FILE, GCabFileClass))
-#define GCAB_IS_FILE(file)         (G_TYPE_CHECK_INSTANCE_TYPE ((file), GCAB_TYPE_FILE))
-#define GCAB_IS_FILE_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GCAB_TYPE_FILE))
-#define GCAB_FILE_GET_CLASS(file)  (G_TYPE_INSTANCE_GET_CLASS ((file), GCAB_TYPE_FILE, GCabFileClass))
-
-typedef struct _GCabFileClass GCabFileClass;
+G_DECLARE_FINAL_TYPE(GCabFile, gcab_file, GCAB, FILE, GObject)
 
 /**
  * GCabFileAttribute:
@@ -57,13 +56,6 @@ typedef enum
 } GCabFileAttribute;
 
 /**
- * GCabFile:
- *
- * An opaque object, referencing a file in a Cabinet.
- **/
-typedef struct _GCabFile GCabFile;
-
-/**
  * GCabFileCallback:
  * @file: the file being processed
  * @user_data: user data passed to the callback.
@@ -73,8 +65,6 @@ typedef struct _GCabFile GCabFile;
  **/
 typedef gboolean (*GCabFileCallback) (GCabFile *file, gpointer user_data);
 
-GType gcab_file_get_type (void) G_GNUC_CONST;
-
 GCabFile *      gcab_file_new_with_file             (const gchar *name, GFile *file);
 GFile *         gcab_file_get_file                  (GCabFile *file);
 const gchar *   gcab_file_get_name                  (GCabFile *file);
@@ -84,8 +74,6 @@ void            gcab_file_get_date                  (GCabFile *file, GTimeVal *r
 const gchar *   gcab_file_get_extract_name          (GCabFile *file);
 void            gcab_file_set_extract_name          (GCabFile *file, const gchar *name);
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(GCabFile, g_object_unref)
-
 G_END_DECLS
 
 #endif /* _GCAB_FILE_H_ */
diff --git a/libgcab/gcab-folder.c b/libgcab/gcab-folder.c
index 10acd9a..8932a14 100644
--- a/libgcab/gcab-folder.c
+++ b/libgcab/gcab-folder.c
@@ -44,9 +44,16 @@
  * gcab_folder_add_file().
  */
 
-struct _GCabFolderClass
+struct _GCabFolder
 {
-    GObjectClass parent_class;
+    GObject parent_instance;
+
+    GSList *files;
+    GHashTable *hash;
+    gint comptype;
+    GByteArray *reserved;
+    cfolder_t cfolder;
+    GInputStream *stream;
 };
 
 enum {
@@ -158,14 +165,21 @@ G_GNUC_INTERNAL gsize
 gcab_folder_get_ndatablocks (GCabFolder *self)
 {
     gsize total_size = 0;
-    GSList *l;
 
-    for (l = self->files; l != NULL; l = l->next)
-        total_size += GCAB_FILE (l->data)->cfile.usize;
+    for (GSList *l = self->files; l != NULL; l = l->next) {
+        GCabFile *file = GCAB_FILE (l->data);
+        total_size += gcab_file_get_usize (file);
+    }
 
     return total_size / DATABLOCKSIZE + 1 ;
 }
 
+G_GNUC_INTERNAL gint
+gcab_folder_get_comptype (GCabFolder *self)
+{
+    return self->comptype;
+}
+
 static gboolean
 add_file (GCabFolder *self, GCabFile *file, GError **error)
 {
@@ -194,7 +208,7 @@ add_file_info (GCabFolder *self, GCabFile *file, GFileInfo *info,
         if (!recurse)
             return TRUE;
 
-        GFileEnumerator *dir = g_file_enumerate_children (file->file, FILE_ATTRS, 0, NULL, error);
+        GFileEnumerator *dir = g_file_enumerate_children (gcab_file_get_gfile (file), FILE_ATTRS, 0, NULL, 
error);
         if (*error) {
             g_warning ("Couldn't enumerate directory %s: %s", name, (*error)->message);
             g_clear_error (error);
@@ -202,7 +216,7 @@ add_file_info (GCabFolder *self, GCabFile *file, GFileInfo *info,
         }
 
         while ((info = g_file_enumerator_next_file (dir, NULL, error)) != NULL) {
-            GFile *child = g_file_get_child (file->file, g_file_info_get_name (info));
+            GFile *child = g_file_get_child (gcab_file_get_gfile (file), g_file_info_get_name (info));
             gchar *child_name = g_build_path ("\\", name, g_file_info_get_name (info), NULL);
             GCabFile *child_file = gcab_file_new_with_file (child_name, child);
 
@@ -346,7 +360,7 @@ sort_by_offset (GCabFile *a, GCabFile *b)
     g_return_val_if_fail (a != NULL, 0);
     g_return_val_if_fail (b != NULL, 0);
 
-    return (gint64)a->cfile.uoffset - (gint64)b->cfile.uoffset;
+    return (gint64) gcab_file_get_uoffset (a) - (gint64) gcab_file_get_uoffset (b);
 }
 
 G_GNUC_INTERNAL gboolean
@@ -426,8 +440,8 @@ gcab_folder_extract (GCabFolder *self,
         if (!out)
             goto end;
 
-        guint32 usize = file->cfile.usize;
-        guint32 uoffset = file->cfile.uoffset;
+        guint32 usize = gcab_file_get_usize (file);
+        guint32 uoffset = gcab_file_get_uoffset (file);
 
         /* let's rewind if need be */
         if (uoffset < nubytes) {
@@ -446,8 +460,8 @@ gcab_folder_extract (GCabFolder *self,
                     goto end;
                 continue;
             } else {
-                gsize offset = file->cfile.uoffset > nubytes ?
-                    file->cfile.uoffset - nubytes : 0;
+                gsize offset = gcab_file_get_uoffset (file) > nubytes ?
+                    gcab_file_get_uoffset (file) - nubytes : 0;
                 const void *p = &cdata.out[offset];
                 gsize count = MIN (usize, cdata.nubytes - offset);
                 if (!g_output_stream_write_all (G_OUTPUT_STREAM (out), p, count,
diff --git a/libgcab/gcab-folder.h b/libgcab/gcab-folder.h
index f858686..12a191b 100644
--- a/libgcab/gcab-folder.h
+++ b/libgcab/gcab-folder.h
@@ -27,21 +27,13 @@
 
 G_BEGIN_DECLS
 
-#define GCAB_TYPE_FOLDER              (gcab_folder_get_type ())
-#define GCAB_FOLDER(folder)           (G_TYPE_CHECK_INSTANCE_CAST ((folder), GCAB_TYPE_FOLDER, GCabFolder))
-#define GCAB_FOLDER_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GCAB_TYPE_FOLDER, GCabFolderClass))
-#define GCAB_IS_FOLDER(folder)        (G_TYPE_CHECK_INSTANCE_TYPE ((folder), GCAB_TYPE_FOLDER))
-#define GCAB_IS_FOLDER_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GCAB_TYPE_FOLDER))
-#define GCAB_FOLDER_GET_CLASS(folder) (G_TYPE_INSTANCE_GET_CLASS ((folder), GCAB_TYPE_FOLDER, 
GCabFolderClass))
-
-typedef struct _GCabFolderClass GCabFolderClass;
-
 /**
  * GCabFolder:
  *
  * An opaque object, referencing a folder in a Cabinet.
  **/
-typedef struct _GCabFolder GCabFolder;
+#define GCAB_TYPE_FOLDER              (gcab_folder_get_type ())
+G_DECLARE_FINAL_TYPE(GCabFolder, gcab_folder, GCAB, FOLDER, GObject)
 
 /**
  * GCabCompression:
@@ -63,8 +55,6 @@ typedef enum
     GCAB_COMPRESSION_MASK = 0xf,
 } GCabCompression;
 
-GType gcab_folder_get_type (void) G_GNUC_CONST;
-
 GCabFolder *    gcab_folder_new               (gint comptype);
 gboolean        gcab_folder_add_file          (GCabFolder *cabfolder,
                                                GCabFile *cabfile,
@@ -74,8 +64,6 @@ gboolean        gcab_folder_add_file          (GCabFolder *cabfolder,
 guint           gcab_folder_get_nfiles        (GCabFolder *cabfolder);
 GSList *        gcab_folder_get_files         (GCabFolder *cabfolder);
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(GCabFolder, g_object_unref)
-
 G_END_DECLS
 
 #endif /* _GCAB_FILE_H_ */
diff --git a/libgcab/gcab-priv.h b/libgcab/gcab-priv.h
index 349735b..b2cb232 100644
--- a/libgcab/gcab-priv.h
+++ b/libgcab/gcab-priv.h
@@ -40,35 +40,18 @@
                                           _GCAB_GET (data, 1, 32,  8) |  \
                                           _GCAB_GET (data, 0, 32,  0))
 
-
-struct _GCabFile
-{
-    GObject parent_instance;
-
-    gchar *name;
-    gchar *extract_name;
-    GFile *file;
-    cfile_t cfile;
-};
-
-struct _GCabFolder
-{
-    GObject parent_instance;
-
-    GSList *files;
-    GHashTable *hash;
-    gint comptype;
-    GByteArray *reserved;
-    cfolder_t cfolder;
-    GInputStream *stream;
-};
-
 GCabFolder *     gcab_folder_new_with_cfolder        (const cfolder_t *folder, GInputStream *stream);
 GCabFile *       gcab_file_new_with_cfile            (const cfile_t *file);
 
 gboolean         gcab_file_update_info               (GCabFile *file, GFileInfo *info);
+guint32          gcab_file_get_uoffset               (GCabFile *file);
 gboolean         gcab_file_set_uoffset               (GCabFile *file, guint32 uoffset);
+guint32          gcab_file_get_usize                 (GCabFile *file);
+GFile           *gcab_file_get_gfile                 (GCabFile *file);
+cfile_t         *gcab_file_get_cfile                 (GCabFile *file);
+void             gcab_file_add_attribute             (GCabFile *file, guint32 attribute);
 
+gint             gcab_folder_get_comptype            (GCabFolder *folder);
 gsize            gcab_folder_get_ndatablocks         (GCabFolder *folder);
 gboolean         gcab_folder_extract                 (GCabFolder *self,
                                                       GFile *path,


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