From 5f70560220c225bce632eacc2f2e9862c13adc9d Mon Sep 17 00:00:00 2001
From: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
Date: Sat, 5 Sep 2026 06:31:39 -0300
Subject: Add 7-Zip fallback for RAR extraction in Ark
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
---
 ark/arch.cpp     | 19 ++++++++++++++++++-
 ark/sevenzip.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++-----------
 ark/sevenzip.h   |  5 ++++-
 3 files changed, 69 insertions(+), 13 deletions(-)

diff --git a/ark/arch.cpp b/ark/arch.cpp
index 1b2d08e2..6c0b1962 100644
--- a/ark/arch.cpp
+++ b/ark/arch.cpp
@@ -471,7 +471,24 @@ Arch *Arch::archFactory( ArchType aType,
       return new ZooArch( parent, filename );
 
     case RAR_FORMAT:
-      return new RarArch( parent, filename );
+    {
+      RarArch *rarArch = new RarArch( parent, filename );
+
+      if ( rarArch->unarchUtilityIsAvailable() )
+        return rarArch;
+
+      const TQString sevenZipProgram = SevenZipArch::findRarSupportProgram();
+      if ( !sevenZipProgram.isEmpty() )
+      {
+        delete rarArch;
+        SevenZipArch *sevenZipArch =
+          new SevenZipArch( parent, filename, sevenZipProgram );
+        sevenZipArch->setReadOnly( true );
+        return sevenZipArch;
+      }
+
+      return rarArch;
+    }
 
     case AA_FORMAT:
       return new ArArch( parent, filename );
diff --git a/ark/sevenzip.cpp b/ark/sevenzip.cpp
index 4a2dde6e..588b7625 100644
--- a/ark/sevenzip.cpp
+++ b/ark/sevenzip.cpp
@@ -24,8 +24,11 @@
 
 */
 
+#include <stdio.h>
+
 #include <tqdir.h>
 #include <tqtextcodec.h>
+#include <tqtextstream.h>
 
 #include <tdeglobal.h>
 #include <tdelocale.h>
@@ -42,20 +45,28 @@
 #include "arkutils.h"
 #include "filelistview.h"
 
-SevenZipArch::SevenZipArch( ArkWidget *gui, const TQString &filename )
+SevenZipArch::SevenZipArch( ArkWidget *gui, const TQString &filename,
+                            const TQString &program )
   : Arch( gui, filename ), m_nameColumnPos( -1 )
 {
-  // Check if 7z is available
-  bool have_7z = !TDEGlobal::dirs()->findExe( "7z" ).isNull();
-  // Check if 7za is available
-  bool have_7za = !TDEGlobal::dirs()->findExe( "7za" ).isNull();
-
-  if ( have_7z )
-    m_archiver_program = m_unarchiver_program = "7z";  // Use 7z
-  else if ( have_7za )
-    m_archiver_program = m_unarchiver_program = "7za"; // Try 7za
+  if ( !program.isEmpty() )
+  {
+    m_archiver_program = m_unarchiver_program = program;
+  }
   else
-    m_archiver_program = m_unarchiver_program = "7zr";
+  {
+    // Check if 7z is available
+    bool have_7z = !TDEGlobal::dirs()->findExe( "7z" ).isNull();
+    // Check if 7za is available
+    bool have_7za = !TDEGlobal::dirs()->findExe( "7za" ).isNull();
+
+    if ( have_7z )
+      m_archiver_program = m_unarchiver_program = "7z";  // Use 7z
+    else if ( have_7za )
+      m_archiver_program = m_unarchiver_program = "7za"; // Try 7za
+    else
+      m_archiver_program = m_unarchiver_program = "7zr";
+  }
 
   verifyCompressUtilityIsAvailable( m_archiver_program );
   verifyUncompressUtilityIsAvailable( m_unarchiver_program );
@@ -75,6 +86,31 @@ SevenZipArch::SevenZipArch( ArkWidget *gui, const TQString &filename )
   m_archCols.append( new ArchColumns( 2, TQRegExp( "[0-9]+" ), 64, true ) ); // Compressed Size
 }
 
+TQString SevenZipArch::findRarSupportProgram()
+{
+  const TQStringList programs = TQStringList() << "7z" << "7za" << "7zr";
+
+  for ( const TQString &program : programs )
+  {
+    if ( TDEGlobal::dirs()->findExe( program ).isNull() )
+      continue;
+
+    const TQCString command = ( program + " i" ).local8Bit();
+    FILE *pipe = popen( command.data(), "r" );
+    if ( !pipe )
+      continue;
+
+    TQTextStream ts( pipe, IO_ReadOnly );
+    bool supportsRar = ts.read().find( TQRegExp( "\\bRar5?\\b" ) ) != -1;
+    pclose( pipe );
+
+    if ( supportsRar )
+      return program;
+  }
+
+  return TQString::null;
+}
+
 SevenZipArch::~SevenZipArch()
 {
 }
diff --git a/ark/sevenzip.h b/ark/sevenzip.h
index 2c16079e..97cbda1a 100644
--- a/ark/sevenzip.h
+++ b/ark/sevenzip.h
@@ -31,8 +31,11 @@ class SevenZipArch : public Arch
   TQ_OBJECT
   
   public:
-    SevenZipArch( ArkWidget *, const TQString & );
+    SevenZipArch( ArkWidget *, const TQString &,
+                  const TQString &program = TQString::null );
     virtual ~SevenZipArch();
+
+    static TQString findRarSupportProgram();
   
     virtual void open();
     virtual void create();
-- 
cgit v1.2.3

