SVN commit 948035 by dfaure: Extract a KonqHistoryLoader from KonqHistoryManager, with only the loading code. Me likes modularity. Made public in libkonq (but don't use it yet, it doesn't update later on, that might be done by another class). Moved KonqHistoryEntry back to libkonq too, but now with a cleaner API. M +1 -2 konqueror/src/CMakeLists.txt D konqueror/src/konqhistoryentry.cpp D konqueror/src/konqhistoryentry.h M +32 -183 konqueror/src/konqhistorymanager.cpp M +13 -52 konqueror/src/konqhistorymanager.h M +1 -1 konqueror/src/konqhistorymodel.h M +11 -6 lib/konq/CMakeLists.txt A lib/konq/konq_historyentry.cpp [License: LGPL (v2/3+eV)] A lib/konq/konq_historyentry.h [License: LGPL (v2/3+eV)] A lib/konq/konq_historyloader.cpp [License: LGPL (v2/3+eV)] A lib/konq/konq_historyloader.h [License: LGPL (v2/3+eV)] --- trunk/KDE/kdebase/apps/konqueror/src/CMakeLists.txt #948034:948035 @@ -20,13 +20,12 @@ set(konquerorprivate_SRCS konqpixmapprovider.cpp konqhistorymanager.cpp - konqhistoryentry.cpp ) qt4_add_dbus_interface(konquerorprivate_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/../../lib/konq/favicons/org.kde.FavIcon.xml favicon_interface) qt4_add_dbus_adaptor(konquerorprivate_SRCS org.kde.Konqueror.HistoryManager.xml konqhistorymanager.h KonqHistoryManager konqhistorymanageradaptor KonqHistoryManagerAdaptor) kde4_add_library(konquerorprivate SHARED ${konquerorprivate_SRCS}) -target_link_libraries(konquerorprivate ${KDE4_KPARTS_LIBS} ${ZLIB_LIBRARY}) +target_link_libraries(konquerorprivate konq ${KDE4_KPARTS_LIBS} ${ZLIB_LIBRARY}) set_target_properties(konquerorprivate PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION} ) install(TARGETS konquerorprivate ${INSTALL_TARGETS_DEFAULT_ARGS}) --- trunk/KDE/kdebase/apps/konqueror/src/konqhistorymanager.cpp #948034:948035 @@ -20,6 +20,7 @@ #include "konqhistorymanager.h" #include "konqhistorymanageradaptor.h" +#include #include #include @@ -33,9 +34,6 @@ #include // for crc32 #include - -const int KonqHistoryManager::s_historyVersion = 4; - KonqHistoryManager::KonqHistoryManager( KBookmarkManager* bookmarkManager, QObject *parent ) : KParts::HistoryProvider( parent ), m_bookmarkManager(bookmarkManager) @@ -49,8 +47,6 @@ m_maxCount = qMax( 1, m_maxCount ); m_maxAgeDays = cs.readEntry( "Maximum age of History entries", 90); - m_filename = KStandardDirs::locateLocal( "data", QLatin1String("konqueror/konq_history")); - // take care of the completion object m_pCompletion = new KCompletion; m_pCompletion->setOrder( KCompletion::Weighted ); @@ -93,150 +89,59 @@ return dbusService() == msg.service(); } -// loads the entire history bool KonqHistoryManager::loadHistory() { clearPending(); - m_history.clear(); m_pCompletion->clear(); - QFile file( m_filename ); - if ( !file.open( QIODevice::ReadOnly ) ) { - if ( file.exists() ) - kWarning() << "Can't open " << file.fileName() ; - - // try to load the old completion history - bool ret = loadFallback(); - emit loadingFinished(); - return ret; + KonqHistoryLoader loader; + if (!loader.loadHistory()) { + return false; } - QDataStream fileStream( &file ); - QByteArray data; // only used for version == 2 - // we construct the stream object now but fill in the data later. - QDataStream crcStream( &data, QIODevice::ReadOnly ); + m_history = loader.entries(); + adjustSize(); - if ( !fileStream.atEnd() ) { - quint32 version; - fileStream >> version; + QListIterator it(m_history); + while (it.hasNext()) { + const KonqHistoryEntry& entry = it.next(); + const QString prettyUrlString = entry.url.prettyUrl(); + addToCompletion(prettyUrlString, entry.typedUrl, entry.numberOfTimesVisited); - QDataStream *stream = &fileStream; - - bool crcChecked = false; - bool crcOk = false; - - if ( version >= 2 && version <= 4) { - quint32 crc; - crcChecked = true; - fileStream >> crc >> data; - crcOk = crc32( 0, reinterpret_cast( data.data() ), data.size() ) == crc; - stream = &crcStream; // pick up the right stream - } - - // We can't read v3 history anymore, because operator<<(KURL) disappeared. - if ( version == 4) - { - // Use QUrl marshalling for V4 format. - KonqHistoryEntry::marshalURLAsStrings = false; - } - - if ( version != 0 && version < 3 ) //Versions 1,2 (but not 0) are also valid - { - //Turn on backwards compatibility mode.. - KonqHistoryEntry::marshalURLAsStrings = true; - // it doesn't make sense to save to save maxAge and maxCount in the - // binary file, this would make backups impossible (they would clear - // themselves on startup, because all entries expire). - // [But V1 and V2 formats did it, so we do a dummy read] - quint32 dummy; - *stream >> dummy; - *stream >> dummy; - - //OK. - version = 3; - } - - if ( s_historyVersion != (int)version || ( crcChecked && !crcOk ) ) { - kWarning() << "The history version doesn't match, aborting loading" ; - file.close(); - emit loadingFinished(); - return false; - } - - - while ( !stream->atEnd() ) { - KonqHistoryEntry entry; - *stream >> entry; - // kDebug(1202) << "loaded entry:" << entry.url << ", Title:" << entry.title; - m_history.append( entry ); - QString urlString2 = entry.url.prettyUrl(); - - addToCompletion( urlString2, entry.typedUrl, entry.numberOfTimesVisited ); - - // and fill our baseclass. - QString urlString = entry.url.url(); - KParts::HistoryProvider::insert( urlString ); - // DF: also insert the "pretty" version if different - // This helps getting 'visited' links on websites which don't use fully-escaped urls. - - if ( urlString != urlString2 ) - KParts::HistoryProvider::insert( urlString2 ); - } - - //kDebug(1202) << "loaded:" << m_history.count() << "entries."; - - qSort( m_history.begin(), m_history.end(), lastVisitedOrder ); - adjustSize(); + // and fill our baseclass. + const QString urlString = entry.url.url(); + KParts::HistoryProvider::insert(urlString); + // DF: also insert the "pretty" version if different + // This helps getting 'visited' links on websites which don't use fully-escaped urls. + if (urlString != prettyUrlString) + KParts::HistoryProvider::insert(prettyUrlString); } - - //This is important - we need to switch to a consistent marshalling format for - //communicating between different konqueror instances. Since during an upgrade - //some "old" copies may still running, we use the old format for the DBUS transfers. - //This doesn't make that much difference performance-wise for single entries anyway. - KonqHistoryEntry::marshalURLAsStrings = true; - - - // Theoretically, we should emit update() here, but as we only ever - // load items on startup up to now, this doesn't make much sense. Same - // thing for the above loadFallback(). - // emit KParts::HistoryProvider::update( some list ); - - - - file.close(); - emit loadingFinished(); - return true; } - -// saves the entire history bool KonqHistoryManager::saveHistory() { - KSaveFile file( m_filename ); + const QString filename = KStandardDirs::locateLocal("data", QLatin1String("konqueror/konq_history")); + KSaveFile file(filename); if ( !file.open() ) { kWarning() << "Can't open " << file.fileName() ; return false; } QDataStream fileStream ( &file ); - fileStream << s_historyVersion; + fileStream << KonqHistoryLoader::historyVersion(); QByteArray data; QDataStream stream( &data, QIODevice::WriteOnly ); - //We use QUrl for marshalling URLs in entries in the V4 - //file format - KonqHistoryEntry::marshalURLAsStrings = false; QListIterator it( m_history ); while ( it.hasNext() ) { - stream << it.next(); + //We use QUrl for marshalling URLs in entries in the V4 + //file format + it.next().save(stream, KonqHistoryEntry::NoFlags); } - //For DBUS, transfer strings instead - wire compat. - KonqHistoryEntry::marshalURLAsStrings = true; - quint32 crc = crc32( 0, reinterpret_cast( data.data() ), data.size() ); fileStream << crc << data; @@ -372,7 +277,8 @@ { QByteArray data; QDataStream stream( &data, QIODevice::WriteOnly ); - stream << entry << dbusService(); + entry.save(stream, KonqHistoryEntry::MarshalUrlAsStrings); + stream << dbusService(); // Protection against very long urls (like data:) if ( data.size() > 4096 ) return; @@ -444,7 +350,12 @@ { KonqHistoryEntry e; QDataStream stream( const_cast( &data ), QIODevice::ReadOnly ); - stream >> e; + + //This is important - we need to switch to a consistent marshalling format for + //communicating between different konqueror instances. Since during an upgrade + //some "old" copies may still running, we use the old format for the DBUS transfers. + //This doesn't make that much difference performance-wise for single entries anyway. + e.load(stream, KonqHistoryEntry::MarshalUrlAsStrings); //kDebug(1202) << "Got new entry from Broadcast:" << e.url; KonqHistoryList::iterator existingEntry = findEntry( e.url ); @@ -595,68 +506,6 @@ saveHistory(); } -// compatibility fallback, try to load the old completion history -bool KonqHistoryManager::loadFallback() -{ - QString file = KStandardDirs::locateLocal( "config", QLatin1String("konq_history")); - if ( file.isEmpty() ) - return false; - - KConfig config( file, KConfig::SimpleConfig); - const KConfigGroup group = config.group("History"); - const QStringList items = group.readEntry( "CompletionItems", QStringList() ); - QStringList::const_iterator it = items.begin(); - - while ( it != items.end() ) { - KonqHistoryEntry entry = createFallbackEntry( *it ); - if ( entry.url.isValid() ) { - m_history.append( entry ); - addToCompletion( entry.url.prettyUrl(), QString(), entry.numberOfTimesVisited ); - - KParts::HistoryProvider::insert( entry.url.url() ); - } - ++it; - } - - qSort( m_history.begin(), m_history.end(), lastVisitedOrder ); - adjustSize(); - saveHistory(); - - return true; -} - -// tries to create a small KonqHistoryEntry out of a string, where the string -// looks like "http://www.bla.com/bla.html:23" -// the attached :23 is the weighting from KCompletion -KonqHistoryEntry KonqHistoryManager::createFallbackEntry(const QString& item) const -{ - // code taken from KCompletion::addItem(), adjusted to use weight = 1 - uint len = item.length(); - uint weight = 1; - - // find out the weighting of this item (appended to the string as ":num") - int index = item.lastIndexOf(':'); - if ( index > 0 ) { - bool ok; - weight = item.mid( index + 1 ).toUInt( &ok ); - if ( !ok ) - weight = 1; - - len = index; // only insert until the ':' - } - - - KonqHistoryEntry entry; - KUrl u( item.left( len )); - // that's the only entries we know about... - entry.url = u; - entry.numberOfTimesVisited = weight; - // to make it not expire immediately... - entry.lastVisited = QDateTime::currentDateTime(); - - return entry; -} - KonqHistoryList::iterator KonqHistoryManager::findEntry( const KUrl& url ) { // small optimization (dict lookup) for items _not_ in our history --- trunk/KDE/kdebase/apps/konqueror/src/konqhistorymanager.h #948034:948035 @@ -28,31 +28,14 @@ #include -#include "konqhistoryentry.h" +#include +#include "konq_historyentry.h" + class KBookmarkManager; class QDBusMessage; class KCompletion; -class KONQUERORPRIVATE_EXPORT KonqHistoryList : public QList -{ -public: - /** - * Finds an entry by URL and return an iterator to it. - * If no matching entry is found, end() is returned. - */ - iterator findEntry( const KUrl& url ); - - /** - * Finds an entry by URL and removes it - */ - void removeEntry( const KUrl& url ); -}; - - -/////////////////////////////////////////////////////////////////// - - /** * This class maintains and manages a history of all URLs visited by one * Konqueror instance. Additionally it synchronizes the history with other @@ -182,30 +165,14 @@ public Q_SLOTS: /** - * Loads the history and fills the completion object. - */ - bool loadHistory(); - - /** - * Saves the entire history. - */ - bool saveHistory(); - - /** * Clears the history and tells all other Konqueror instances via DBUS * to do the same. * The history is saved afterwards, if necessary. */ void emitClear(); - Q_SIGNALS: /** - * Emitted after the entire history was loaded from disk. - */ - void loadingFinished(); - - /** * Emitted after a new entry was added */ void entryAdded( const KonqHistoryEntry& entry ); @@ -286,6 +253,16 @@ private: /** + * Loads the history and fills the completion object. + */ + bool loadHistory(); + + /** + * Saves the entire history. + */ + bool saveHistory(); + + /** * Does the work for @ref addPending() and @ref confirmPending(). * * Adds an entry to the history. If an entry with @p url already exists, @@ -343,25 +320,9 @@ */ KonqHistoryList::iterator findEntry( const KUrl& url ); - /** - * Stuff to create a proper history out of KDE 2.0's konq_history for - * completion. - */ - bool loadFallback(); - KonqHistoryEntry createFallbackEntry( const QString& ) const; - void addToCompletion( const QString& url, const QString& typedUrl, int numberOfTimesVisited = 1 ); void removeFromCompletion( const QString& url, const QString& typedUrl ); - /** - * Ensures that the items are sorted by the lastVisited date - * (oldest goes first) - */ - static bool lastVisitedOrder( const KonqHistoryEntry& lhs, const KonqHistoryEntry& rhs ) { - return lhs.lastVisited < rhs.lastVisited; - } - - QString m_filename; KonqHistoryList m_history; /** --- trunk/KDE/kdebase/apps/konqueror/src/konqhistorymodel.h #948034:948035 @@ -22,7 +22,7 @@ #include -#include "konqhistoryentry.h" +#include "konq_historyentry.h" class KonqHistoryManager; namespace KHM --- trunk/KDE/kdebase/apps/lib/konq/CMakeLists.txt #948034:948035 @@ -5,23 +5,28 @@ ########### libkonq ############### -# Please use .cpp for new files +# For crc32 in konq_historyloader.cpp +include_directories( ${ZLIB_INCLUDE_DIR} ) + set(konq_LIB_SRCS - konq_popupmenu.cpp # remains in libkonq, was needed by kicker applets like the trash applet - konq_popupmenuinformation.cpp # used by KonqPopupMenu, KonqMenuActions and KonqPopupMenuPlugin + konq_popupmenu.cpp # used by konqueror, kfind, folderview, kickoff konq_popupmenuplugin.cpp # for KonqPopupMenu and its plugins knewmenu.cpp # used by dolphin, KonqPopupMenu, and konqueror (File menu; to be moved to dolphinpart) - konq_menuactions.cpp # used by dolphin, KonqPopupMenu. Move to kdelibs, for kickoff? konq_copytomenu.cpp # used by dolphin, KonqPopupMenu konq_operations.cpp # used by dolphin and konqueror konq_events.cpp konqmimedata.cpp # used by dolphin, KonqOperations, some filemanagement konqueror modules. - konq_fileitemcapabilities.cpp # used in dolphin and dolphinpart already. + konq_historyentry.cpp + konq_historyloader.cpp + + konq_popupmenuinformation.cpp # deprecated (functionality has moved to kdelibs) + konq_menuactions.cpp # deprecated (functionality has moved to kdelibs) + konq_fileitemcapabilities.cpp # deprecated (functionality has moved to kdelibs) ) kde4_add_library(konq SHARED ${konq_LIB_SRCS}) -target_link_libraries(konq ${KDE4_KPARTS_LIBS}) +target_link_libraries(konq ${KDE4_KPARTS_LIBS} ${ZLIB_LIBRARY}) target_link_libraries(konq LINK_INTERFACE_LIBRARIES ${KDE4_KPARTS_LIBS}) set_target_properties(konq PROPERTIES