summaryrefslogtreecommitdiffstats
path: root/ark/archiveformatinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ark/archiveformatinfo.cpp')
-rw-r--r--ark/archiveformatinfo.cpp278
1 files changed, 278 insertions, 0 deletions
diff --git a/ark/archiveformatinfo.cpp b/ark/archiveformatinfo.cpp
new file mode 100644
index 0000000..f2ac14d
--- /dev/null
+++ b/ark/archiveformatinfo.cpp
@@ -0,0 +1,278 @@
+/*
+
+ ark -- archiver for the KDE project
+
+ Copyright (C) 2003 Georg Robbers <Georg.Robbers@urz.uni-hd.de>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include "arch.h"
+#include "archiveformatinfo.h"
+#include "settings.h"
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kfilterdev.h>
+
+#include <qfile.h>
+
+ArchiveFormatInfo * ArchiveFormatInfo::m_pSelf = 0;
+
+ArchiveFormatInfo::ArchiveFormatInfo()
+ :m_lastExtensionUnknown( false )
+{
+ buildFormatInfos();
+}
+
+ArchiveFormatInfo * ArchiveFormatInfo::self()
+{
+ if ( !m_pSelf )
+ m_pSelf = new ArchiveFormatInfo();
+ return m_pSelf;
+}
+
+void ArchiveFormatInfo::buildFormatInfos()
+{
+ addFormatInfo( TAR_FORMAT, "application/x-tgz", ".tar.gz" );
+ addFormatInfo( TAR_FORMAT, "application/x-tzo", ".tar.lzo" );
+ addFormatInfo( TAR_FORMAT, "application/x-tarz", ".tar.z" );
+ addFormatInfo( TAR_FORMAT, "application/x-tbz", ".tar.bz2" );
+ addFormatInfo( TAR_FORMAT, "application/x-tbz2", ".tar.bz2" );
+ // x-tar as the last one to get its comment for all the others, too
+ addFormatInfo( TAR_FORMAT, "application/x-tar", ".tar" );
+
+ addFormatInfo( LHA_FORMAT, "application/x-lha", ".lha" );
+
+ addFormatInfo( ZIP_FORMAT, "application/x-jar", ".jar" );
+ addFormatInfo( ZIP_FORMAT, "application/x-zip", ".zip" );
+ addFormatInfo( ZIP_FORMAT, "application/x-zip-compressed", ".zip" );
+
+ addFormatInfo( COMPRESSED_FORMAT, "application/x-gzip", ".gz" );
+ addFormatInfo( COMPRESSED_FORMAT, "application/x-bzip", ".bz" );
+ addFormatInfo( COMPRESSED_FORMAT, "application/x-bzip2", ".bz2" );
+ addFormatInfo( COMPRESSED_FORMAT, "application/x-lzop", ".lzo" );
+ addFormatInfo( COMPRESSED_FORMAT, "application/x-compress", ".Z" );
+ find( COMPRESSED_FORMAT ).description = i18n( "Compressed File" );
+
+ addFormatInfo( ZOO_FORMAT, "application/x-zoo", ".zoo" );
+
+ addFormatInfo( RAR_FORMAT, "application/x-rar", ".rar" );
+ addFormatInfo( RAR_FORMAT, "application/x-rar-compressed", ".rar" );
+
+ addFormatInfo( AA_FORMAT, "application/x-deb", ".deb" );
+ addFormatInfo( AA_FORMAT, "application/x-archive",".a" );
+
+ addFormatInfo( SEVENZIP_FORMAT, "application/x-7z", ".7z" );
+
+ if ( ArkSettings::aceSupport() )
+ addFormatInfo( ACE_FORMAT, "application/x-ace", ".ace" );
+}
+
+void ArchiveFormatInfo::addFormatInfo( ArchType type, QString mime, QString stdExt )
+{
+ FormatInfo & info = find( type );
+
+ KDesktopFile * desktopFile = new KDesktopFile( mime + ".desktop", true, "mime" );
+ if( !desktopFile )
+ kdWarning( 1601 ) << "MimeType " << mime << " seems to be missing." << endl;
+ KMimeType mimeType( desktopFile );
+ info.mimeTypes.append( mimeType.name() );
+ info.extensions += mimeType.patterns();
+ info.defaultExtensions += stdExt;
+ info.allDescriptions.append( mimeType.comment() );
+ info.description = mimeType.comment();
+
+ delete desktopFile;
+}
+
+
+QString ArchiveFormatInfo::filter()
+{
+ QStringList allExtensions;
+ QString filter;
+ InfoList::Iterator it;
+ for ( it = m_formatInfos.begin(); it != m_formatInfos.end(); ++it )
+ {
+ allExtensions += (*it).extensions;
+ filter += "\n" + (*it).extensions.join( " " ) + '|' + (*it).description;
+ }
+ return allExtensions.join( " " ) + '|' + i18n( "All Valid Archives\n" )
+ + "*|" + i18n( "All Files" )
+ + filter;
+}
+
+const QStringList ArchiveFormatInfo::supportedMimeTypes( bool includeCompressed )
+{
+ QStringList list;
+
+ InfoList::Iterator end = m_formatInfos.end();
+ for ( InfoList::Iterator it = m_formatInfos.begin(); it != end; ++it )
+ {
+ if ( includeCompressed || ( *it ).type != COMPRESSED_FORMAT )
+ {
+ list += ( *it ).mimeTypes;
+ }
+ }
+
+ return list;
+}
+
+QStringList ArchiveFormatInfo::allDescriptions()
+{
+ QStringList descriptions;
+ InfoList::Iterator it;
+ for ( it = m_formatInfos.begin(); it != m_formatInfos.end(); ++it )
+ descriptions += (*it).allDescriptions;
+ return descriptions;
+}
+
+ArchiveFormatInfo::FormatInfo & ArchiveFormatInfo::find( ArchType type )
+{
+ InfoList::Iterator it = m_formatInfos.begin();
+ for( ; it != m_formatInfos.end(); ++it )
+ if( (*it).type == type )
+ return (*it);
+
+ FormatInfo info;
+ info.type = type;
+ return ( *m_formatInfos.append( info ) );
+}
+
+ArchType ArchiveFormatInfo::archTypeByExtension( const QString & archname )
+{
+ InfoList::Iterator it = m_formatInfos.begin();
+ QStringList::Iterator ext;
+ for( ; it != m_formatInfos.end(); ++it )
+ {
+ ext = (*it).extensions.begin();
+ for( ; ext != (*it).extensions.end(); ++ext )
+ if( archname.endsWith( (*ext).remove( '*' ) ) )
+ return (*it).type;
+ }
+ return UNKNOWN_FORMAT;
+}
+
+ArchType ArchiveFormatInfo::archTypeForMimeType( const QString & mimeType )
+{
+ InfoList::Iterator it = m_formatInfos.begin();
+ for( ; it != m_formatInfos.end(); ++it )
+ {
+ int index = (*it).mimeTypes.findIndex( mimeType );
+ if( index != -1 )
+ return (*it).type;
+ }
+ return UNKNOWN_FORMAT;
+}
+
+ArchType ArchiveFormatInfo::archTypeForURL( const KURL & url )
+{
+ m_lastExtensionUnknown = false;
+
+ if( url.isEmpty() )
+ return UNKNOWN_FORMAT;
+
+ if( !QFile::exists( url.path() ) )
+ return archTypeByExtension( url.path() );
+
+ QString mimeType = KMimeType::findByURL( url, 0, true, true )->name();
+ kdDebug( 1601 ) << "find by url: " << mimeType << endl;
+ if( mimeType == KMimeType::defaultMimeType() )
+ {
+ m_lastExtensionUnknown = true;
+ mimeType = KMimeType::findByFileContent( url.path() )->name();
+ }
+
+ ArchType archType = archTypeForMimeType( mimeType );
+ if ( archType == UNKNOWN_FORMAT )
+ m_lastExtensionUnknown = true;
+
+ return archType;
+}
+
+
+QString ArchiveFormatInfo::findMimeType( const KURL & url )
+{
+ QString mimeType = KMimeType::findByURL( url )->name();
+ if ( mimeType != "application/x-bzip2" && mimeType != "application/x-gzip" )
+ return mimeType;
+
+ QIODevice * dev = KFilterDev::deviceForFile( url.path(), mimeType );
+ if ( !dev )
+ return mimeType;
+
+ char buffer[ 0x200 ];
+
+ dev->open( IO_ReadOnly );
+ Q_LONG n = dev->readBlock( buffer, 0x200 );
+ delete dev;
+
+ if ( n == 0x200 && buffer[0] != 0 && !strncmp(buffer + 257, "ustar", 5) )
+ {
+ if (mimeType == "application/x-bzip2")
+ return "application/x-tbz";
+ else
+ return "application/x-tgz";
+ }
+
+ return mimeType;
+}
+
+QString ArchiveFormatInfo::mimeTypeForDescription( const QString & description )
+{
+ InfoList::Iterator it = m_formatInfos.begin();
+ int index;
+ for( ; it != m_formatInfos.end(); ++it )
+ {
+ index = (*it).allDescriptions.findIndex( description );
+ if ( index != -1 )
+ return (* (*it).mimeTypes.at( index ) );
+ }
+ return QString::null;
+}
+
+QString ArchiveFormatInfo::descriptionForMimeType( const QString & mimeType )
+{
+ InfoList::Iterator it = m_formatInfos.begin();
+ int index;
+ for( ; it != m_formatInfos.end(); ++it )
+ {
+ index = (*it).mimeTypes.findIndex( mimeType );
+ if ( index != -1 )
+ return (* (*it).allDescriptions.at( index ) );
+ }
+ return QString::null;
+}
+
+QString ArchiveFormatInfo::defaultExtension( const QString & mimeType )
+{
+ InfoList::Iterator it = m_formatInfos.begin();
+ int index;
+ for( ; it != m_formatInfos.end(); ++it )
+ {
+ index = (*it).mimeTypes.findIndex( mimeType );
+ if ( index != -1 )
+ return (* (*it).defaultExtensions.at( index ) );
+ }
+ return QString::null;
+}
+
+bool ArchiveFormatInfo::wasUnknownExtension()
+{
+ return m_lastExtensionUnknown;
+}
+