示例#1
0
文件: app.cpp 项目: Ram-Z/hexdame
App::App(int &argc, char **argv)
    : QApplication(argc, argv)
    , _invocation(argv[0])
    , _gui(false)
    , _interactive(false)
{
    // Enforce singleton property
    if (_instance) {
        throw std::runtime_error("Only one instance of App allowed.");
    }

    // Remember if we are done
    bool done = false;

    // Set the singleton instance to this
    _instance = this;

    // Set the application properties
    setApplicationName(APPLICATION_NAME);
    setApplicationVersion(APPLICATION_VERSION_STRING);
    setOrganizationName(APPLICATION_VENDOR_NAME);
    setOrganizationDomain(APPLICATION_VENDOR_URL);

    // Configure the logging mechanism
    log4cxx::LoggerPtr rootlogger = log4cxx::Logger::getRootLogger();
    rootlogger->addAppender(new log4cxx::ConsoleAppender(new log4cxx::PatternLayout("[%-5p] %m%n")));

    // Parse the commandline
    int idx = 1;
    while (idx < argc) {
        QString arg(argv[idx]);
        if (matches_option(arg, "help", 0) || matches_option(arg, "h") || matches_option(arg, "?", 0)) {
            printHelpMessage();
            std::exit(0);
        } else if (matches_option(arg, "version", 0)) {
            printVersionMessage();
            std::exit(0);
        } else if (matches_option(arg, "version-triplet")) {
            printVersionTripletMessage();
            std::exit(0);
        } else if (matches_option(arg, "prefset")) {
            // Verify that there is another argument
            if ((idx + 1) >= argc) {
                LOG4CXX_FATAL(_logger, "Option \"" << arg << "\" requires a parameter.");
                std::exit(1);
            }

            // Increment the index
            idx++;

            // Get the next parameter
            std::string param(argv[idx]);

            // Determine if there is an equals sign
            // If there is, set the preference;
            // Otherwise, remove the preference
            size_t eqidx = param.find('=');
            if (eqidx != std::string::npos) {
                std::string key = param.substr(0, eqidx);
                std::string val = param.substr(eqidx + 1);
                setPreference(key, val);
            } else {
                unsetPreference(param);
            }
            done = true;
        } else if (matches_option(arg, "prefdel")) {
            // Verify that there is another argument
            if ((idx + 1) >= argc) {
                LOG4CXX_FATAL(_logger, "Option \"" << arg << "\" requires a parameter.");
                std::exit(1);
            }

            // Increment the index
            idx++;

            // Get the next parameter
            std::string param(argv[idx]);

            // Remove the preference
            unsetPreference(param);
            done = true;
        } else if (matches_option(arg, "preflist")) {
            printAllPreferences();
            done = true;
        } else if (matches_option(arg, "prefget")) {
            // Verify that there is another argument
            if ((idx + 1) >= argc) {
                LOG4CXX_FATAL(_logger, "Option \"" << arg << "\" requires a parameter.");
                std::exit(1);
            }

            // Increment the index
            idx++;

            // Get the next parameter
            std::string param(argv[idx]);

            // Print the preference
            printPreference(param);
            done = true;
        } else if (matches_option(arg, "loglevel")) {
            // Verify that there is another argument
            if ((idx + 1) >= argc) {
                LOG4CXX_FATAL(_logger, "Option \"" << arg << "\" requires a parameter.");
                std::exit(1);
            }

            // Increment the index
            idx++;

            // Get the next parameter
            std::string param(argv[idx]);

            // Determine if there is an equals sign and act accordingly
            size_t eqidx = param.find('=');
            if (eqidx != std::string::npos) {
                std::string logger = param.substr(0, eqidx);
                std::string level  = param.substr(eqidx + 1);
                setLogLevel(logger, level);
            } else {
                setLogLevel("", param);
            }
        } else if (matches_option(arg, "appid") || matches_option(arg, "application-identifier")) {
            printApplicationIdentifier();
            std::exit(0);
        } else if (matches_option(arg, "gui")) {
            if (_interactive) {
                LOG4CXX_FATAL(_logger, "Cannot specify both \"--gui\" and \"--interactive\" simultaneously.");
                std::exit(1);
            }
            if (_gui) {
                LOG4CXX_WARN(_logger, "Option \"" << arg << "\" already specified. Ignoring.");
            }
            _gui = true;
        } else if (matches_option(arg, "interactive")) {
            if (_gui) {
                LOG4CXX_FATAL(_logger, "Cannot specify both \"--gui\" and \"--interactive\" simultaneously.");
                std::exit(1);
            }
            if (_interactive) {
                LOG4CXX_WARN(_logger, "Option \"" << arg << "\" already specified. Ignoring.");
            }
            _interactive = true;
        } else {
            LOG4CXX_WARN(_logger, "Unrecognized option: \"" << arg << "\". Ignoring");
        }
        idx++;
    }

    initGUI();
}
void PhononItem::metaStateChanged(Phonon::State newState, Phonon::State oldState) {
    Q_UNUSED(oldState);
  //  static QObjectWriter writer(this, false);

    if (newState == Phonon::ErrorState) {
        qDebug() << "PhononItem: Error Opening File: " << fileName();

        emit fetched(false);
        return;
    }

    if (m_metaMedia->currentSource().type() == Phonon::MediaSource::Invalid) {

        emit fetched(false);
        qDebug() << "Invalid metadata: " << fileName();
        return;
    }

    QMap<QString, QString> metaData = m_metaMedia->metaData();

    setArtist(metaData.value("ARTIST"));
    setTrackTitle(metaData.value("TITLE"));
    setAlbumTitle(metaData.value("ALBUM"));
    setGenre(metaData.value("GENRE"));
    QString tn = metaData.value("TRACK-NUMBER");
    if (tn == QString()) tn = metaData.value("TRACKNUMBER");
    setTrackNumber(tn);
    extendedComment = QString();
    QString comment =  metaData.value("COMMENT");
    setComment(comment);
    
    // http://www.freedesktop.org/wiki/Specifications/free-media-player-specs
    QString fmpsRating = metaData.value("FMPS_Rating");
    // ??? Why does this not work?
    if (fmpsRating.toDouble() > 0 ) {
        int stars = fmpsRating.toDouble() * 10;
        Preference fmpsPref(stars);
        qDebug() << "FMPS Rating: " << stars;
        setPreference(fmpsPref);
    }

    // Preference can be obtained from various ways.
    else setPreference(comment);

    // Check for MusicMatch preference
    if ((preference().intValue() == 0) && metaData.contains("EXTENDED-COMMENT")) {
        extendedComment = metaData.value("EXTENDED-COMMENT");
        int eqidx = extendedComment.indexOf("=");
        if (eqidx > 0)
            extendedComment=extendedComment.mid(eqidx+1);
        Preference p(extendedComment);
        if (p.intValue() > 0) {
            setPreference(p);
            setComment(p.toString());
        }
    }

//start id="notify"
    m_loaded = true;
    if (m_timeSet) {
        emit fetched();
    }
//end

}