kio Library API Documentation

fileprops.cpp

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., 59 Temple Place - Suite 330, 00016 Boston, MA 02111-1307, 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 }
KDE Logo
This file is part of the documentation for kio Library Version 3.3.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Oct 17 11:29:14 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003