int main(int argc, char **argv)
{
    const bool kdeRunning = kdeIsRunning();

    KAboutData aboutData("kbookmarkmerger", I18N_NOOP("KBookmarkMerger"), "1.0",
                         I18N_NOOP("Merges bookmarks installed by 3rd parties into the user's bookmarks"), KAboutData::License_BSD,
                         I18N_NOOP("Copyright © 2005 Frerich Raabe"));
    aboutData.addAuthor("Frerich Raabe", I18N_NOOP("Original author"), "*****@*****.**");

    KCmdLineArgs::init(argc, argv, &aboutData);
    KCmdLineArgs::addCmdLineOptions(cmdLineOptions);

    if(!kdeRunning)
    {
        KApplication::disableAutoDcopRegistration();
    }
    KApplication app(false, false);
    app.disableSessionManagement();

    KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
    if(args->count() != 1)
    {
        kdError() << "No directory to scan for bookmarks specified." << endl;
        return 1;
    }

    KBookmarkManager *konqBookmarks = KBookmarkManager::userBookmarksManager();
    QStringList mergedFiles;
    {
        KBookmarkGroup root = konqBookmarks->root();
        for(KBookmark bm = root.first(); !bm.isNull(); bm = root.next(bm))
        {
            if(bm.isGroup())
            {
                continue;
            }

            QString mergedFrom = bm.metaDataItem("merged_from");
            if(!mergedFrom.isNull())
            {
                mergedFiles << mergedFrom;
            }
        }
    }

    bool didMergeBookmark = false;

    QString extraBookmarksDirName = QFile::decodeName(args->arg(0));
    QDir extraBookmarksDir(extraBookmarksDirName, "*.xml");
    if(!extraBookmarksDir.isReadable())
    {
        kdError() << "Failed to read files in directory " << extraBookmarksDirName << endl;
        return 1;
    }

    for(unsigned int i = 0; i < extraBookmarksDir.count(); ++i)
    {
        const QString fileName = extraBookmarksDir[i];
        if(mergedFiles.find(fileName) != mergedFiles.end())
        {
            continue;
        }

        const QString absPath = extraBookmarksDir.filePath(fileName);
        KBookmarkManager *mgr = KBookmarkManager::managerForFile(absPath, false);
        KBookmarkGroup root = mgr->root();
        for(KBookmark bm = root.first(); !bm.isNull(); bm = root.next(bm))
        {
            if(bm.isGroup())
            {
                continue;
            }
            bm.setMetaDataItem("merged_from", fileName);
            konqBookmarks->root().addBookmark(konqBookmarks, bm, false);
            didMergeBookmark = true;
        }
    }

    if(didMergeBookmark)
    {
        if(!konqBookmarks->save())
        {
            kdError() << "Failed to write merged bookmarks." << endl;
            return 1;
        }
        if(kdeRunning)
        {
            konqBookmarks->notifyChanged("");
        }
    }
}