[evince/wip/hadess/unrar-libarchive: 1/2] comics: Use libarchive for RAR support




commit 2abaead59471b876f82d871bc60e669493678c52
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Jan 12 16:18:00 2022 +0100

    comics: Use libarchive for RAR support
    
    As new in version XXX.
    
    Closes: #1725

 backend/comics/ev-archive.c | 56 ++++-----------------------------------------
 backend/comics/meson.build  |  1 -
 meson.build                 |  2 +-
 3 files changed, 6 insertions(+), 53 deletions(-)
---
diff --git a/backend/comics/ev-archive.c b/backend/comics/ev-archive.c
index 0ee31a619..13f54f58d 100644
--- a/backend/comics/ev-archive.c
+++ b/backend/comics/ev-archive.c
@@ -22,7 +22,6 @@
 
 #include <archive.h>
 #include <archive_entry.h>
-#include <unarr/unarr.h>
 #include <gio/gio.h>
 
 #define BUFFER_SIZE (64 * 1024)
@@ -34,10 +33,6 @@ struct _EvArchive {
        /* libarchive */
        struct archive *libar;
        struct archive_entry *libar_entry;
-
-       /* unarr */
-       ar_stream *unarr_stream;
-       ar_archive *unarr;
 };
 
 G_DEFINE_TYPE(EvArchive, ev_archive, G_TYPE_OBJECT);
@@ -49,9 +44,6 @@ ev_archive_finalize (GObject *object)
 
        switch (archive->type) {
        case EV_ARCHIVE_TYPE_RAR:
-               g_clear_pointer (&archive->unarr, ar_close_archive);
-               g_clear_pointer (&archive->unarr_stream, ar_close);
-               break;
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -94,6 +86,8 @@ libarchive_set_archive_type (EvArchive *archive,
                archive_read_support_format_tar (archive->libar);
        else if (archive_type == EV_ARCHIVE_TYPE_RAR5)
                archive_read_support_format_rar5 (archive->libar);
+       else if (archive_type == EV_ARCHIVE_TYPE_RAR)
+               archive_read_support_format_rar (archive->libar);
        else
                g_assert_not_reached ();
 }
@@ -115,8 +109,6 @@ ev_archive_set_archive_type (EvArchive *archive,
 
        switch (archive_type) {
        case EV_ARCHIVE_TYPE_RAR:
-               archive->type = archive_type;
-               break;
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -136,7 +128,6 @@ ev_archive_open_filename (EvArchive   *archive,
                          GError     **error)
 {
        int r;
-       ArArchiveError code;
 
        g_return_val_if_fail (EV_IS_ARCHIVE (archive), FALSE);
        g_return_val_if_fail (archive->type != EV_ARCHIVE_TYPE_NONE, FALSE);
@@ -146,24 +137,6 @@ ev_archive_open_filename (EvArchive   *archive,
        case EV_ARCHIVE_TYPE_NONE:
                g_assert_not_reached ();
        case EV_ARCHIVE_TYPE_RAR:
-               archive->unarr_stream = ar_open_file (path);
-               if (archive->unarr_stream == NULL) {
-                       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-                                            "Error opening archive");
-                       return FALSE;
-               }
-               archive->unarr = ar_open_rar_archive_with_error (archive->unarr_stream, &code);
-               if (archive->unarr == NULL) {
-                       g_clear_pointer (&archive->unarr_stream, ar_close);
-                       if (code == AR_ARCHIVE_ERROR_RAR5) {
-                               libarchive_set_archive_type (archive, EV_ARCHIVE_TYPE_RAR5);
-                               return ev_archive_open_filename (archive, path, error);
-                       }
-                       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-                                            "Error opening RAR archive");
-                       return FALSE;
-               }
-               return TRUE;
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -220,7 +193,6 @@ ev_archive_read_next_header (EvArchive *archive,
        case EV_ARCHIVE_TYPE_NONE:
                g_assert_not_reached ();
        case EV_ARCHIVE_TYPE_RAR:
-               return ar_parse_entry (archive->unarr);
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -241,8 +213,6 @@ ev_archive_get_entry_pathname (EvArchive *archive)
        case EV_ARCHIVE_TYPE_NONE:
                g_assert_not_reached ();
        case EV_ARCHIVE_TYPE_RAR:
-               g_return_val_if_fail (archive->unarr != NULL, NULL);
-               return ar_entry_get_name (archive->unarr);
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -261,11 +231,9 @@ ev_archive_get_entry_size (EvArchive *archive)
        g_return_val_if_fail (archive->type != EV_ARCHIVE_TYPE_NONE, -1);
 
        switch (archive->type) {
-       case EV_ARCHIVE_TYPE_RAR:
-               g_return_val_if_fail (archive->unarr != NULL, -1);
-               return ar_entry_get_size (archive->unarr);
        case EV_ARCHIVE_TYPE_NONE:
                g_assert_not_reached ();
+       case EV_ARCHIVE_TYPE_RAR:
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -284,12 +252,9 @@ ev_archive_get_entry_is_encrypted (EvArchive *archive)
        g_return_val_if_fail (archive->type != EV_ARCHIVE_TYPE_NONE, FALSE);
 
        switch (archive->type) {
-       case EV_ARCHIVE_TYPE_RAR:
-               g_return_val_if_fail (archive->unarr != NULL, FALSE);
-               /* password-protected RAR is not even detected right now */
-               return FALSE;
        case EV_ARCHIVE_TYPE_NONE:
                g_assert_not_reached ();
+       case EV_ARCHIVE_TYPE_RAR:
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -313,17 +278,9 @@ ev_archive_read_data (EvArchive *archive,
        g_return_val_if_fail (archive->type != EV_ARCHIVE_TYPE_NONE, -1);
 
        switch (archive->type) {
-       case EV_ARCHIVE_TYPE_RAR:
-               g_return_val_if_fail (archive->unarr != NULL, -1);
-               if (!ar_entry_uncompress (archive->unarr, buf, count)) {
-                       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-                                            "Failed to decompress RAR data");
-                       return -1;
-               }
-               r = count;
-               break;
        case EV_ARCHIVE_TYPE_NONE:
                g_assert_not_reached ();
+       case EV_ARCHIVE_TYPE_RAR:
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
@@ -348,9 +305,6 @@ ev_archive_reset (EvArchive *archive)
 
        switch (archive->type) {
        case EV_ARCHIVE_TYPE_RAR:
-               g_clear_pointer (&archive->unarr, ar_close_archive);
-               g_clear_pointer (&archive->unarr_stream, ar_close);
-               break;
        case EV_ARCHIVE_TYPE_ZIP:
        case EV_ARCHIVE_TYPE_7Z:
        case EV_ARCHIVE_TYPE_TAR:
diff --git a/backend/comics/meson.build b/backend/comics/meson.build
index 1e740194b..c245b1ba7 100644
--- a/backend/comics/meson.build
+++ b/backend/comics/meson.build
@@ -7,7 +7,6 @@ incs = backends_incs + [cut_n_paste_inc]
 
 deps = backends_deps + [
   libarchive_dep,
-  libunarr_dep,
 ]
 
 shared_module(
diff --git a/meson.build b/meson.build
index 410f70f65..e56bce2f3 100644
--- a/meson.build
+++ b/meson.build
@@ -349,7 +349,7 @@ else
 endif
 
 # *** Comic Book ***
-libarchive_req_version = '>= 3.2.0'
+libarchive_req_version = '>= 3.2.0' # FIXME needs a newer version
 libarchive_dep = dependency('libarchive', version: libarchive_req_version, required: get_option('comics'))
 enable_comics = libarchive_dep.found()
 if enable_comics


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