Ejemplo n.º 1
0
void SearchProvider::beatportIdsBasedSearch(QMap<QString, QString> * uid_Bpid_Map)
{
    O1Beatport * oauthManager = O1Beatport::instance();
    O1Requestor requestManager(_manager, oauthManager);
    if(!oauthManager->linked()) {
        LOG_ERROR("Unable to perform a search from IDs, Beatport OAuth is not linked");
        // TODO: emit an error signal per request
        return;
    }

    QUrl requestUrl(TYM_BEATPORT_API_URL + _tracksPath);
    QList<QMap<QString, QString> *> splittedMaps;

    int i = 0;
    for (auto it = uid_Bpid_Map->begin() ; it != uid_Bpid_Map->end() ; ++it, ++i) {

        int listIndex = i / 10;
        if(splittedMaps.size() == listIndex) {
            splittedMaps.append(new QMap<QString, QString>());
        }

        splittedMaps.value(listIndex)->insert(it.key(), it.value());
    }

    for(auto tempMap : splittedMaps) {

        QString idsList = QStringList(tempMap->values()).join(",");

        QList<O1RequestParameter> params;
        params << O1RequestParameter("ids", idsList.toLatin1());

        requestUrl.setQuery(QUrlQuery(O1::createQueryParams(params)));
        QNetworkRequest request(requestUrl);

        QNetworkReply *reply = requestManager.get(request, params);
        connect(reply, SIGNAL(finished()), this, SLOT(bpidSearchParseResponce()));
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
                this, SLOT(requestError(QNetworkReply::NetworkError)));

        LOG_DEBUG(QString("Request sent for IDs %1").arg(idsList));
        _replyMap.insert(reply, tempMap);
    }

    delete uid_Bpid_Map;
}
Ejemplo n.º 2
0
/* FIXME: Some requests never receive response
Need more tests. When searching automatically AND manually on the same track (same libId),
sometimes one of the responses does not call the slot. Therefore, it should because the requests
and associated QNetworkReply are totally different objects and should not be in conflict.
Maybe related to QNetworkSignalMapper. Also, what is the benefit of having a mapper here ? A simple
QMap<QReply, QString> should be sufficient
*/
void SearchProvider::naturalSearch(QMap<QString, QString> *id_SearchText_Map)
{
    O1Beatport * oauthManager = O1Beatport::instance();
    O1Requestor requestManager(_manager, oauthManager);
    if(!oauthManager->linked()) {
        LOG_ERROR("Unable to perform a search from text, Beatport OAuth is not linked");
        // TODO: emit an error signal
        return;
    }

    QUrl requestUrl(TYM_BEATPORT_API_URL + _searchPath);

    QMapIterator<QString, QString> searchList(*id_SearchText_Map);
    while(searchList.hasNext()) {
        searchList.next();
        QString libId = searchList.key();
        QString text = searchList.value();

        if(text.isEmpty()) return;

        // Replace underscores by spaces (and prevent multiple spaces)
        Utils::instance()->simplifySpaces(text.replace('_', ' '));

        QList<O1RequestParameter> params;
        params << O1RequestParameter("query", text.toLatin1());
        params << O1RequestParameter("facets", "fieldType:track");

        requestUrl.setQuery(QUrlQuery(O1::createQueryParams(params)));
        QNetworkRequest request(requestUrl);

        QNetworkReply *reply = requestManager.get(request, params);

        _naturalSearchMapper->setMapping(reply, libId);
        connect(reply, SIGNAL(finished()),
                _naturalSearchMapper, SLOT(map()));
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
                this, SLOT(requestError(QNetworkReply::NetworkError)));

        LOG_DEBUG(QString("Request sent for search \"%1\"").arg(text));
    }
    delete id_SearchText_Map;
}
Ejemplo n.º 3
0
int ClientServer::start() {
    m_running = true;

    if(socketTCP.listen(m_serverPort) != sf::Socket::Done) {
        std::cout <<"/!\\Fail " << "Unable to start server"<< std::endl;
        return -1;
    }

    std::cout <<"Info " << "Server started on port : "  << m_serverPort << std::endl;
    std::cout <<"Info " << "Server is listening TCP connection !" << std::endl;


    // Time management
    sf::Clock clock;

    // client connexion
    sf::Socket::Status socketStatus;

    //Socket non bloquante
    socketTCP.setBlocking(false);

    std::cout << std::endl;
    std::cout <<"Info " << "En attente de la connection d'un joueur... " << std::endl;

    while(m_running) {
// On accepte les clients
        // TODO gérer le cas où le nombre maximum de clients est atteint
        if(socketTCP.accept(
                *listeSocket[indiceClient].get()) == sf::Socket::Done) {
            listeVerifSocket[indiceClient] = true;
            listeVerifSocketHelper[indiceClient] = true;


            // On affiche les traces
            std::cout <<" << " << "Client connecte sur la socket n " <<
                cast::toString(indiceClient) << ", adresse : " <<
                listeSocket[indiceClient].get()->getRemoteAddress().toString() <<
                "::" << cast::toString(listeSocket[indiceClient].get()->getRemotePort())
                << std::endl;
        }

        // On regarde si des données sont arrivées
        // On gère aussi les sockets dans le std::vector
        for(unsigned int i = 0; i < listeSocket.size(); i++) {

            sf::Packet packet;
            if(!listeSocketOccupee[i]) {
                socketStatus = listeSocket[i].get()->receive(packet);
                sf::Int32 idRequest;
                std::string sRequest;
                packet >>idRequest >> sRequest;

                switch(socketStatus)
                {
                    case sf::Socket::NotReady:
                        // Aucune données à recevoir
                        break;

                    case sf::Socket::Done:
                        // Gestion de la requête
                        requestManager(idRequest, sRequest, listeSocket[i].get(), i);
                        break;

                    case sf::Socket::Error:
                        listeVerifSocket[i] = false;
                        break;

                    case sf::Socket::Disconnected:
                        listeVerifSocket[i] = false;
                        break;

                    default:
                        break;
                }
            }
        }

        // On gère le prochain indice d'insertion de la socket
        listSocketManager();

        // 240 Hz
        if(clock.getElapsedTime().asMilliseconds() < 4.17) {
            sf::sleep(sf::milliseconds((sf::Int32) (4.17 - clock.getElapsedTime().asMilliseconds())));
        }

        // RAZ horloge
        clock.restart();
    }