• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kio

fileprops.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE libraries
00002    Copyright (C) 2002,2003 Carsten Pfeiffer <pfeiffer@kde.org>
00003 
00004    library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation, version 2.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00016    Boston, MA 02110-1301, USA.
00017 */
00018 
00019 #include <iostream>
00020 
00021 #include <qfile.h>
00022 #include <qptrlist.h>
00023 
00024 #include <kaboutdata.h>
00025 #include <kapplication.h>
00026 #include <kcmdlineargs.h>
00027 #include <kfilemetainfo.h>
00028 #include <klocale.h>
00029 #include <kpropertiesdialog.h>
00030 
00031 #include "fileprops.h"
00032 
00033 #define KFILEVERSION "0.2"
00034 #define INDENT "\t"
00035 
00036 using namespace std;
00037 
00038 static QString beatifyValue( const QString& value )
00039 {
00040     if ( value.isNull() )
00041         return QString("(no value for key available)");
00042     else if ( value.isEmpty() )
00043         return QString("(empty)");
00044 
00045     return value;
00046 }
00047 
00048 FileProps::FileProps( const QString& path, const QStringList& suppliedGroups )
00049     : m_dirty( false )
00050 {
00051     m_info = new KFileMetaInfo(path, QString::null, KFileMetaInfo::Everything);
00052     m_userSuppliedGroups = !suppliedGroups.isEmpty();
00053     m_groupsToUse = m_userSuppliedGroups ? suppliedGroups : m_info->groups();
00054 }
00055 
00056 FileProps::~FileProps()
00057 {
00058     sync();
00059     delete m_info;
00060 }
00061 
00062 bool FileProps::sync()
00063 {
00064     if ( !m_dirty )
00065         return true;
00066 
00067     return m_info->applyChanges();
00068 }
00069 
00070 bool FileProps::isValid() const
00071 {
00072     return m_info->isValid();
00073 }
00074 
00075 QStringList FileProps::supportedGroups() const
00076 {
00077     return m_info->supportedGroups();
00078 }
00079 
00080 QStringList FileProps::availableGroups() const
00081 {
00082     return m_info->groups();
00083 }
00084 
00085 QStringList FileProps::supportedKeys( const QString& group ) const
00086 {
00087     KFileMetaInfoGroup g = m_info->group( group );
00088     return g.supportedKeys();
00089 }
00090 
00091 QStringList FileProps::availableKeys( const QString& group ) const
00092 {
00093     KFileMetaInfoGroup g = m_info->group( group );
00094     QStringList allKeys = g.keys();
00095     QStringList ret;
00096     QStringList::ConstIterator it = allKeys.begin();
00097     for ( ; it != allKeys.end(); ++it )
00098     {
00099         if ( g.item( *it ).isValid() )
00100             ret.append( *it );
00101     }
00102 
00103     return ret;
00104 }
00105 
00106 QStringList FileProps::preferredKeys( const QString& group ) const
00107 {
00108     KFileMetaInfoGroup g = m_info->group( group );
00109     return g.preferredKeys();
00110 }
00111 
00112 QString FileProps::getValue( const QString& group,
00113                              const QString& key ) const
00114 {
00115     KFileMetaInfoGroup g = m_info->group( group );
00116     return FileProps::createKeyValue( g, key );
00117 }
00118 
00119 bool FileProps::setValue( const QString& group,
00120                           const QString& key, const QString &value )
00121 {
00122     KFileMetaInfoGroup g = m_info->group( group );
00123     bool wasAdded = false;
00124     if ( !g.isValid() )
00125     {
00126         if ( m_info->addGroup( group ) )
00127         {
00128             wasAdded = true;
00129             g = m_info->group( group );
00130         }
00131         else
00132             return false;
00133     }
00134 
00135     bool ok = g[key].setValue( value );
00136 
00137     if ( !ok && wasAdded ) // remove the created group again
00138         (void) m_info->removeGroup( group );
00139         
00140     m_dirty |= ok;
00141     return ok;
00142 }
00143 
00144 QStringList FileProps::allValues( const QString& group ) const
00145 {
00146     KFileMetaInfoGroup g = m_info->group( group );
00147     return FileProps::createKeyValueList( g, g.keys() );
00148 }
00149 
00150 QStringList FileProps::preferredValues( const QString& group ) const
00151 {
00152     KFileMetaInfoGroup g = m_info->group( group );
00153     return FileProps::createKeyValueList( g, g.preferredKeys() );
00154 }
00155 
00156 // static helper:
00157 // creates strings like
00158 // "group:       translatedKey:               value"
00159 QString FileProps::createKeyValue( const KFileMetaInfoGroup& g,
00160                                    const QString& key )
00161 {
00162     static const int MAX_SPACE = 25;
00163     KFileMetaInfoItem item = g.item( key );
00164 
00165     QString result("%1");
00166     result = result.arg( (item.isValid() ? item.translatedKey() : key) + ":",
00167                          -MAX_SPACE );
00168     result.append( beatifyValue( item.string() ) );
00169 
00170     QString group("%1");
00171     group = group.arg( g.translatedName() + ":", -MAX_SPACE );
00172     result.prepend( group );
00173 
00174     return result;
00175 }
00176 
00177 // static
00178 QStringList FileProps::createKeyValueList( const KFileMetaInfoGroup& g,
00179                                            const QStringList& keys )
00180 {
00181     QStringList result;
00182     QStringList::ConstIterator it = keys.begin();
00183 
00184     for ( ; it != keys.end(); ++it )
00185         result.append( FileProps::createKeyValue( g, *it ) );
00186 
00187     return result;
00188 }
00189 
00192 
00193 
00194 
00195 // kfile --mimetype --listsupported --listavailable --listpreferred --listwritable --getValue "key" --setValue "key=value" --allValues --preferredValues --dialog --quiet file [file...]
00196 // "key" may be a list of keys, separated by commas
00197 static KCmdLineOptions options[] =
00198 {
00199     { "m", 0, 0 }, // short option for --mimetype
00200     { "nomimetype", I18N_NOOP("Do not print the mimetype of the given file(s)"), 0 },
00201 
00202     { "ls", 0, 0 }, // short option for --listsupported
00203     { "listsupported <mimetype>",
00204       I18N_NOOP("List all supported metadata keys of the given file(s). "
00205                 "If mimetype is not specified, the mimetype of the given "
00206                 "files is used." ), "file" },
00207 
00208     { "lp", 0, 0 }, // short option for --listpreferred
00209     { "listpreferred <mimetype>",
00210       I18N_NOOP("List all preferred metadata keys of the given file(s). "
00211                 "If mimetype is not specified, the mimetype of the given "
00212                 "files is used." ), "file" },
00213 
00214     { "la", 0, 0 }, // short option for --listavailable
00215     { "listavailable",
00216       I18N_NOOP("List all metadata keys which have a value in the given "
00217                 "file(s)."), 0 },
00218 
00219     { "sm", 0, 0 }, // short option for --supportedMimetypes
00220     { "supportedMimetypes",
00221       I18N_NOOP("Prints all mimetypes for which metadata support is "
00222                 "available."), 0 },
00223 
00224     { "q", 0, 0 }, // short option for --quiet
00225     { "quiet",
00226       I18N_NOOP("Do not print a warning when more than one file was given "
00227                 "and they do not all have the same mimetype."), 0 },
00228 
00229     { "av", 0, 0 }, // short option for --allValues
00230     { "allValues",
00231       I18N_NOOP("Prints all metadata values, available in the given "
00232                 "file(s)."), 0 },
00233 
00234     { "pv", 0, 0 }, // short option for --preferredValues
00235     { "preferredValues",
00236       I18N_NOOP("Prints the preferred metadata values, available in the "
00237                 "given file(s)."), 0 },
00238 
00239     { "dialog",
00240       I18N_NOOP("Opens a KDE properties dialog to allow viewing and "
00241                 "modifying of metadata of the given file(s)"), 0 },
00242 
00243     { "getValue <key>",
00244       I18N_NOOP("Prints the value for 'key' of the given file(s). 'key' "
00245                 "may also be a comma-separated list of keys"), 0 },
00246 
00247     { "setValue <key=value>",
00248       I18N_NOOP("Attempts to set the value 'value' for the metadata key "
00249                 "'key' for the given file(s)"), 0 },
00250 
00251     { "!groups <arguments>", I18N_NOOP("The group to get values from or set values to"),
00252       0 },
00253 
00254     { "+[files]",
00255       I18N_NOOP("The file (or a number of files) to operate on."), 0 },
00256     KCmdLineLastOption
00257 };
00258 
00259 
00260 //
00261 // helper functions
00262 //
00263 
00264 static void printSupportedMimeTypes()
00265 {
00266     QStringList allMimeTypes = KFileMetaInfoProvider::self()->supportedMimeTypes();
00267     if ( allMimeTypes.isEmpty() )
00268     {
00269         cout <<
00270             i18n("No support for metadata extraction found.").local8Bit()
00271              << endl;
00272         return;
00273     }
00274 
00275     cout << i18n("Supported MimeTypes:").local8Bit() << endl;
00276 
00277     QStringList::ConstIterator it = allMimeTypes.begin();
00278     for ( ; it != allMimeTypes.end(); it++ )
00279         cout << (*it).local8Bit() << endl;
00280 }
00281 
00282 // caller needs to delete the returned list!
00283 static KFileItemList * fileItemList( const KCmdLineArgs *args )
00284 {
00285     KFileItemList * items = new KFileItemList();
00286     items->setAutoDelete( true );
00287     for ( int i = 0; i < args->count(); i++ )
00288         items->append( new KFileItem( KFileItem::Unknown,
00289                                      KFileItem::Unknown,
00290                                      args->url( i ) ));
00291     return items;
00292 }
00293 
00294 static void showPropertiesDialog( const KCmdLineArgs *args )
00295 {
00296     KFileItemList *items = fileItemList( args );
00297     new KPropertiesDialog( *items, 0L, "props dialog", true );
00298     delete items;
00299 }
00300 
00301 static void printMimeTypes( const KCmdLineArgs *args )
00302 {
00303     for ( int i = 0; i < args->count(); i++ )
00304     {
00305         KURL url = args->url( i );
00306         KMimeType::Ptr mt = KMimeType::findByURL( url );
00307         cout << args->arg(i) << ": " << mt->comment().local8Bit() << " ("
00308              << mt->name().local8Bit() << ")" << endl;
00309     }
00310 }
00311 
00312 static void printList( const QStringList& list )
00313 {
00314     QStringList::ConstIterator it = list.begin();
00315     for ( ; it != list.end(); ++it )
00316         cout << (*it).local8Bit() << endl;
00317     cout << endl;
00318 }
00319 
00320 static void processMetaDataOptions( const QPtrList<FileProps> propList,
00321                                     KCmdLineArgs *args )
00322 {
00323 // kfile --mimetype --supportedMimetypes --listsupported --listavailable --listpreferred --listwritable --getValue "key" --setValue "key=value" --allValues --preferredValues --dialog --quiet file [file...]
00324 // "key" may be a list of keys, separated by commas
00325 
00326     QString line("-- -------------------------------------------------------");
00327     FileProps *props;
00328     QPtrListIterator<FileProps> it( propList );
00329     for ( ; (props = it.current()); ++it )
00330     {
00331         QString file = props->fileName() + " ";
00332         QString fileString = line.replace( 3, file.length(), file );
00333         cout << QFile::encodeName( fileString ) << endl;
00334             
00335         if ( args->isSet( "listsupported" ) )
00336         {
00337             cout << "=Supported Keys=" << endl;
00338             printList( props->supportedKeys() );
00339         }
00340         if ( args->isSet( "listpreferred" ) )
00341         {
00342             cout << "=Preferred Keys=" << endl;
00343             printList( props->preferredKeys() );
00344         }
00345         if ( args->isSet( "listavailable" ) )
00346         {
00347             cout << "=Available Keys=" << endl;
00348             QStringList groups = props->availableGroups();
00349             QStringList::ConstIterator git = groups.begin();
00350             for ( ; git != groups.end(); ++git )
00351             {
00352                 cout << "Group: " << (*git).local8Bit() << endl;
00353                 printList( props->availableKeys( *git ) );
00354             }
00355         }
00356 //         if ( args->isSet( "listwritable" ) )
00357 //         {
00358 //             cout << "TODO :)" << endl;
00359 //         }
00360         if ( args->isSet( "getValue" ) )
00361         {
00362             cout << "=Value=" << endl;
00363             QString key = QString::fromLocal8Bit( args->getOption("getValue"));
00364             QStringList::ConstIterator git = props->groupsToUse().begin();
00365             for ( ; git != props->groupsToUse().end(); ++git )
00366                 cout << props->getValue( *git, key ).local8Bit() << endl;
00367         }
00368 
00369         if ( args->isSet( "setValue" ) )
00370         {
00371             // separate key and value from the line "key=value"
00372             QString cmd = QString::fromLocal8Bit( args->getOption("setValue"));
00373             QString key = cmd.section( '=', 0, 0 );
00374             QString value = cmd.section( '=', 1 );
00375 
00376             // either use supplied groups or all supported groups
00377             // (not only the available!)
00378             QStringList groups = props->userSuppliedGroups() ?
00379                                  props->groupsToUse() :
00380                                  props->supportedGroups();
00381 
00382             QStringList::ConstIterator git = groups.begin();
00383             for ( ; git != groups.end(); ++git )
00384                 props->setValue( *git, key, value );
00385         }
00386 
00387         if ( args->isSet( "allValues" ) )
00388         {
00389             cout << "=All Values=" << endl;
00390             QStringList groups = props->availableGroups();
00391             QStringList::ConstIterator group = groups.begin();
00392             for ( ; group != groups.end(); ++group )
00393                 printList( props->allValues( *group ) );
00394         }
00395         if ( args->isSet( "preferredValues" ) && !args->isSet("allValues") )
00396         {
00397             cout << "=Preferred Values=" << endl;
00398             QStringList groups = props->availableGroups();
00399             QStringList::ConstIterator group = groups.begin();
00400             for ( ; group != groups.end(); ++group )
00401                 printList( props->preferredValues( *group ) );
00402         }
00403     }
00404 
00405 }
00406 
00407 int main( int argc, char **argv )
00408 {
00409     KAboutData about(
00410       "kfile", I18N_NOOP( "kfile" ), KFILEVERSION,
00411       I18N_NOOP("A commandline tool to read and modify metadata of files." ),
00412       KAboutData::License_LGPL, "(c) 2002, Carsten Pfeiffer",
00413       0 /*text*/, "http://devel-home.kde.org/~pfeiffer/",
00414       "pfeiffer@kde.org" );
00415 
00416     about.addAuthor( "Carsten Pfeiffer", 0, "pfeiffer@kde.org",
00417              "http://devel-home.kde.org/~pfeiffer/" );
00418 
00419     KCmdLineArgs::init( argc, argv, &about );
00420 
00421     KCmdLineArgs::addCmdLineOptions( options );
00422 
00423     KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
00424     bool useGUI = args->isSet( "dialog" );
00425 
00426     KApplication app( useGUI, useGUI );
00427 
00428     QPtrList<FileProps> m_props;
00429     m_props.setAutoDelete( true );
00430 
00431     bool quiet = args->isSet( "quiet" );
00432 
00433     if ( args->isSet( "supportedMimetypes" ) )
00434         printSupportedMimeTypes();
00435 
00436     int files = args->count();
00437     if ( files == 0 )
00438         KCmdLineArgs::usage( i18n("No files specified") ); // exit()s
00439 
00440     if ( args->isSet( "dialog" ) )
00441     {
00442         showPropertiesDialog( args );
00443         return true;
00444     }
00445 
00446     QStringList groupsToUse;
00447     QCStringList suppliedGroups = args->getOptionList( "groups" );
00448     QCStringList::ConstIterator it = suppliedGroups.begin();
00449     for ( ; it != suppliedGroups.end(); ++it )
00450         groupsToUse.append( QString::fromLocal8Bit( (*it) ) );
00451 
00452     QString mimeType;
00453 
00454     for ( int i = 0; i < files; i++ )
00455     {
00456         if ( args->isSet( "mimetype" ) )
00457             printMimeTypes( args );
00458 
00459         FileProps *props = new FileProps( args->url(i).path(), groupsToUse );
00460         if ( props->isValid() )
00461             m_props.append( props );
00462         else
00463         {
00464             if ( !quiet )
00465             {
00466                 cerr << args->arg(i) << ": " <<
00467                 i18n("Cannot determine metadata").local8Bit() << endl;
00468             }
00469             delete props;
00470         }
00471     }
00472 
00473 
00474     processMetaDataOptions( m_props, args );
00475 
00476     m_props.clear(); // force destruction/sync of props
00477     cout.flush();
00478 
00479     return 0;
00480 }

kio

Skip menu "kio"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal