[gcab] Use G_DECLARE_FINAL_TYPE to remove lots of C boilerplate
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gcab] Use G_DECLARE_FINAL_TYPE to remove lots of C boilerplate
- Date: Thu, 14 Dec 2017 13:35:36 +0000 (UTC)
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]